Hibernate高级查询方法

本文介绍了Hibernate中的HQL查询技巧,包括投影查询、分页查询、连接查询等,并详细解释了各种连接类型如内连接、左外连接及右外连接等的用法,同时还涵盖了分组查询、聚合查询及子查询等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

投影查询——过滤部分字段
返回的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才能灵活应用,这一点毋庸置疑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值