📅  最后修改于: 2023-12-03 15:39:26.618000             🧑  作者: Mango
Hibernate Criteria Query Language(简称HCQL)是一种非常强大的Hibernate查询语言。它是一种完全面向对象的查询API,它允许您很容易地构建动态查询,而无需按照基于字符串的查询定义查询语句。
下面我们将重点介绍HCQL及其相关用法。
HCQL主要包括4个部分:Select(选择)、From(从哪个表中查询)、Where(查询条件)和Order by(排序) 。
下面是一个最简单的HCQL查询:
Criteria criteria = session.createCriteria(Employee.class);
List<Employee> employees = criteria.list();
我们可以使用select关键字来指定查询哪几个字段,如下面的代码所示:
Criteria criteria = session.createCriteria(Employee.class)
.setProjection(Projections.projectionList()
.add(Projections.property("name"), "name")
.add(Projections.property("salary"), "salary")
.add(Projections.property("department"), "department")
.add(Projections.property("address.city"), "city")
.add(Projections.property("address.state"), "state"))
.setResultTransformer(Transformers.aliasToBean(EmployeeDTO.class));
List<EmployeeDTO> employees = criteria.list();
这里我们使用了Projection
接口来指定查询哪些属性,其中Projections.property()
方法用来指定要查询的属性。我们还使用了aliasToBean()
将结果集转换成类。
使用createCriteria()
方法来指定查询哪张表。此外,您还可以使用createAlias()
方法在源表上建立一个别名来指向另一个表,如下所示:
Criteria criteria = session.createCriteria(Employee.class, "employee")
.createAlias("employee.department", "department")
.createAlias("employee.address", "address");
Criteria
中有很多方法来帮助您指定查询条件,如下所示:
Criteria criteria = session.createCriteria(Employee.class)
.add(Restrictions.eq("name", "John"))
.add(Restrictions.gt("salary", 5000))
.add(Restrictions.between("startDate", start, end))
.add(Restrictions.like("name", "J%"))
.add(Restrictions.and(Restrictions.gt("salary", 5000), Restrictions.le("salary", 10000)))
.add(Restrictions.or(Restrictions.eq("department", "IT"), Restrictions.eq("department", "HR")));
上面的代码展示了如何使用Restrictions
来指定条件。
使用addOrder()
方法来指定排序的规则:
Criteria criteria = session.createCriteria(Employee.class)
.addOrder(Order.asc("name"))
.addOrder(Order.desc("salary"));
您可以使用setFirstResult()
和setMaxResults()
方法来指定分页查询的页面大小和页面编号,如下所示:
Criteria criteria = session.createCriteria(Employee.class)
.setFirstResult(1)
.setMaxResults(10);
HCQL还可以支持复杂查询,如多表连接查询、子查询、统计函数等。
Criteria criteria = session.createCriteria(Employee.class, "employee")
.createAlias("employee.department", "department", JoinType.INNER_JOIN);
DetachedCriteria subQuery = DetachedCriteria.forClass(Department.class, "d")
.add(Restrictions.in("d.name", Arrays.asList("IT", "HR")))
.setProjection(Projections.property("d.id"));
criteria.add(Property.forName("employee.department.id").in(subQuery))
.add(Restrictions.ge("employee.salary", 5000))
.setProjection(Projections.groupProperty("employee.department"))
.setProjection(Projections.avg("employee.salary"));
List<Object[]> result = criteria.list();
上面展示了一个复杂查询,其中使用了JoinType
来指定联接类型,DetachedCriteria
来进行子查询,使用了groupProperty()
和avg()
统计函数。
HCQL是Hibernate查询API的一个非常强大的部分。它允许您根据动态查询条件构建灵活的查询并返回结果。上面的教程旨在让您了解HCQL的一些常用技术,希望这些知识可以帮助您更好地使用HCQL。