Hibernate高级查询方法

时间:2021-10-03 19:32:20

投影查询——过滤部分字段
返回的List集合元素为Object[]
Query query = session.createQuery("select c.cname, c.csex from Customer c");
List list = query.list();
Iterator iter = list.iterator();
Object[] objs = null;
while(iter.hasNext()){
objs = (Object[]) iter.next();
for(int i = 0; i < objs.length; i ++){
System.out.println(objs[i]);
}
System.out.println("-------------------");
}

分页查询
Query query = session.createQuery("from Customer c");
query.setFirstResult((当前页-1) * 页大小);//从哪儿开始取
query.setMaxResults(页大小);//最多取多少条记录
Iterator iter = query.list().iterator();
Customer c = null;
while(iter.hasNext()){
c = (Customer) iter.next();
System.out.print(c);
}

连接查询——多表连接
连接类型 HQL语法
内连接  inner join 或者 join
迫切内连接 inner join fetch 或者 join fetch
左外连接 left outer join 或者 left join
迫切左外连接 left outer join fetch 或者 left join fetch
右外连接 right outer join 或者 right join

迫切左外连接
Query query = session.createQuery("from Customer c left join fetch c.orders o");
Iterator iter = query.list().iterator();
说明:
关键字:left join fetch
返回结果为Customer类型,再通过Customer对象导航到Orders对象
返回结果可能包含重复元素,通过Set去掉重复行
结果见备注

左外连接
Query query = session.createQuery("from Customer c left join c.orders o");
Iterator iter = query.list().iterator();
说明:
关键字:left join
返回的集合中,元素类型为Object[],该数组包含Customer和Orders对象,即:Object[0]=Customer,Object[1]=Orders
没有重复元素
结果见备注

内连接
Query query = session.createQuery("from Customer c inner join c.orders o");
Iterator iter = query.list().iterator();
说明:
关键字:inner join
返回的集合中,元素类型为Object[],该数组包含Customer和Orders对象,即:Object[0]=Customer,Object[1]=Orders
没有重复元素
结果见备注
和左外连接的处理方式相同

迫切内连接
Query query = session.createQuery("from Customer c inner join fetch c.orders o");
Iterator iter = query.list().iterator();
说明:
关键字:inner join fetch
返回结果为Customer类型,再通过Customer对象导航到Orders对象
返回结果可能包含重复元素,通过Set去掉重复行
结果见备注
处理方式和迫切左外连接相同

右外连接
Query query = session.createQuery("from Customer c right outer join c.orders o");
 Iterator iter = query.list().iterator();
说明:
关键字:right outer join
返回的集合中,元素类型为Object[],该数组包含Customer和Orders对象,即:Object[0]=Customer,Object[1]=Orders
没有重复元素
结果见备注
和左连接、内连接的处理方式相同

投影查询
Query query = session.createQuery("select c.cid, c.cname, o.odate from Customer c right outer join c.orders o");
 Iterator iter = query.list().iterator();
说明
投影即只返回一部分字段
返回的结果集中,元素类型为Object[],数组中元素个数即为select语句后的字段个数
结果见备注

分组查询与聚合查询——group by
对客户按性别分组
select c.csex, count(*) from Customer c group by c.csex
说明:
返回的结果集中,元素类型为Object[],数组元素个数即为返回的字段个数
统计出每个客户的订单数量
select c.cname, count(o) from Customer c left join c.orders o group by c.cname
找出年龄最大的客户
Query query = session.createQuery("select max(c.cage) from Customer c");
Object obj = query.uniqueResult();
通过uniqueResult()保证只返回一个结果
代码见备注

子查询
找出年龄大于平均年龄的客户
select c.cname, c.cage from Customer c where c.cage > (select avg(c.cage) from Customer c)
结果见备注
子查询可以和all,any,some,in,exists使用
找出至少有一份订单的客户
from Customer c where exists (from c.orders)
代码见备注

总结
了解Hibernate的检索策略对于查询结果的优化大有稗益
Hibernate的HQL语法和sql非常相似,有sql基础的人非常容易学习
只有精通SQL才能灵活应用,这一点毋庸置疑