【转】Hibernate高级查询方法
【转自】http://blog.csdn.net/canduecho/article/details/4149924
投影查询——过滤部分字段 返回的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才能灵活应用,这一点毋庸置疑
相关推荐
昊 2020-05-29
LuoXinLoves 2020-05-26
wenjieyatou 2020-05-08
康慧欣 2020-02-16
暗夜之城 2019-12-18
ncomoon 2019-04-12
ncomoon 2019-09-03
dilipy 2019-07-01
ZoeYen 2019-07-01
落地窗前梦残夜 2019-06-29
hhboyggyy 2014-08-25
quchj 2013-10-31
haojusheng 2012-12-04
逆流而上的鲤鱼 2011-12-30
追求 2011-06-28
chenssss 2011-04-05
sofast 2019-06-27
javamagicsun 2019-06-26