HQL(Hibernate Query Language)描写对象操作的一种查询语言,是Hibernate特有的。与SQL语法基本一致,不同的是HQL是面向对象的查询,查询的是对象和对象中的属性。HQL的关键字不区分大小写,但类名和属性名区分大小写。
语法示例:
SELECT 别名/属性名/表达式
FROM 实体 AS 别名
WHERE 过滤条件
GROUP BY 分组条件
HAVING 分组后结果的过滤条件
ORDER BY 排序条件
1、查询所有的客户
Query query = session.createQuery("from com.zju.model.Customer");
List
2、选择查询
Query query = session.createQuery("select c from Customer as c where c.cid = 1");
3、投影查询
在选择查询的基础上,将查询的结果封装到对象中
Query query = session.createQuery("select new Customer(c.cid , c.cname) from Customer c");
List
4、排序
Query query = session.createQuery("from Customer order by cid desc");
List
5、分页
Query query = session.createQuery("from Customer");
query.setFirstResult(0); //从哪个索引开始查询,包括索引本身的记录 startIndex = (pageNum - 1)*pageSize
query.setMaxResults(2); //每页显示个数 pageSize
6、绑定参数
方式一:占位符,使用?,在hql语句中替换具体的参数
Query query = session.createQuery("select c from Customer where cid = ?");
query.setInteger(0,cid); //参数1:?位置,从0开始 参数2:实际参数
方式二:别名,格式:“属性 = :别名”
Query query = session.createQuery("select c from Customer where cid = :xxx");
query.setParameter("xxx", cid); //参数1:别名 参数2:实际参数
7、聚合函数和分组
聚合:count、avg、sum、max、min....
分组:group by ... having...
//查询每个客户下订单的数量
Query query = session.createQuery("select o.Customer , count(o) from Order o group by o.Customer");
8、连接查询
连接查询主要有:内连接、迫切内连接、隐式内连接、做外连接、迫切左外连接、右外连接、交叉连接。下面举例说明几个常用的:
//左外连接
List list = session.createQuery("from Cusstomer c left outer join c.orderSet").list();
//迫切左外连接(默认数据重复)
List list = session.createQuery("from Cusstomer c left outer join fetch c.orderSet").list();
//迫切左外连接(去重复)
List list = session.createQuery("select distinct c from Cusstomer c left outer join c.orderSet").list();