一.回顾基本的SQL查询
select/update/delect ... from ... where ...group by... having ...order by... asc/desc
insert into ... value ...
update ... set ...
1.单表查询 select * from xx;
2.多表查询 A a1,a2 B b1,b2
1)内关联
a)相等
from A a inner join B b on a.a1 <> b.b1 //a1,b1为字段名,a、b为表的别名
b)不相等
from A a inner join B b on a.a1 = b.b1
2)外关联
a)左外
from A a outer left join B b on a.a1 = b.b1;
b)右外
from A a outer right join B b on a.a1 = b.b1;
c)全关联
from A a full join B b on a.a1=b.b1;
3)笛卡尔乘积
from A a cross join B b;
3.嵌套查询
二.HQL和SQL的对比
不同: HQL SQL
1) HQL中少了select关键字
2)from后跟: 实体类名 表名
3)查询条件: 字段名 查询条件:实体类的属性名
4)大小写: 区分(类名,属性名) 不区分(表名,字段名)
相同: 查询的关键字都不区分大小写
其他:
hql语句和sql语句的语法以及子句的意义都是一样的
sql面向表和字段进行查询 关键字、表、字段不区分大小写 结果是记录集合
hql面向对象和属性进行查询 关键字不区分大小写,对象和属性区分大小写 对象的集合
有问号占位符(序号是从0开始)(setXXX(序号,值))
可以用 :别名 的方式
setXXX("别名",值)
Hibernate支持分页
Query.setFirstResult(当前页的第一条记录位置)
Query.setMaxResult(每页的记录数)
Query.list执行hql语句,返回List结果集(实体对象,Object[])
投影查询出的结果,是什么数据结构?(二维的Object数组)
三.hql语句小结
注意: 从Hibernate框架中获取session对象的方式有哪些?
只有:SessionFacotry.openSession() 因为HibernateSessionFactory.getSession 是MyEclipse做的
1.实体查询:
- //查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并放入list集合中
- Session session = HibernateSessionFactory.getSession();
- String sql = "from User";
- List list = session.createQuery(hql).list();
2.实体的更新与删除
- Session session = HibernateSessionFactory.getSession();
- Transaction trans = session.beginTransaction();
- String sql = "update User user set user.age=20 where user.name='admin'";
- Query query = session.createQuery(hql);
- trans.commit();
3.属性查询
1)检索对象的单个属性:- String hql = "select user.name from User user";
- List list = session.createQuery(hql).list;
- for(Object o : list) {
- System.out.println(o.toString());
- }
2)检索对象的多个属性:
a)使用object 数组形式返回
- String hql="select user.name,user.age from User user";
- list list = session.createQuery(hql).list;
- for(int i=0;i<list.size();i++) {
- Object[] obj = (Object[])list.get(i);
- System.out.println(obj[0]);
- System.out.println(obj[1]);
- }
b)使用面向对象的思想
//注意select语句中的new User
- String hql ="select new User(user.name,user.age) from User user";
- List list = session.createQuery(hql).list();
- for(int i=0;i<list.size();i++)
- System.out.println(user.getName());
- System.out.println(user.getAge());
- }
4.排序与分组1)排序
eg. from User user order by user.name asc,user age desc;
2)分组 count() sum() max() min() avg()
select count(user),user.age from User user group by user.age having count(user)>10;
四.参数绑定
1.按参数名称绑定(定义命名参数以:开头)
- String hql = "from User user where user.name=:username and user.age:=userage";
- Query query = session.createQuery(hql);
- query.setString("username",name);
- query.setInt("userage",age);
2.按参数位置绑定:用"?"来定义参数位置,形式如下:- String hql = "from User user where user.name=? and user.age=?";
- Query query = session.createQuery(hql);
- query.setString(0,name);
- query.setInt(1,age);
注:推荐用第一种,增加了程序的可读性
3.setParameter()方法,支持通过setParameter()方法设置任意类型的参数
- String hql = "from User user where user.name=:username";
- Query query = session.createQuery(hql);
- query.setParameter("username",name,Hibernate.STRING);
方法包含三个参数 setParameter(命名参数名称,命名参数值,命名参数映射类型);
第三个参数可以省略,可以自动得到此类型
五.使用Hibernate进行分页查询
逻辑分页(效率低不推荐)和物理分页(不用数据库不同mysql limit语句 oracle为rownum语句)
查询出第2页的所有用户数据示例,每页最大记录为10
- int pageNo = 2;
- int pageSize = 10;
- String hql = "from User";
- Query query = session.createQuery(hql);
- query.setFirstResult((pageNo - 1) * pageSize);
- query.setMaxResults(pageSize);
- query.list();
阅读(16054) | 评论(0) | 转发(2) |