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