📜  带有示例的Hibernate Criteria Query Language(HCQL)教程(1)

📅  最后修改于: 2023-12-03 15:39:26.618000             🧑  作者: Mango

带有示例的Hibernate Criteria Query Language(HCQL)教程

Hibernate Criteria Query Language(简称HCQL)是一种非常强大的Hibernate查询语言。它是一种完全面向对象的查询API,它允许您很容易地构建动态查询,而无需按照基于字符串的查询定义查询语句。

下面我们将重点介绍HCQL及其相关用法。

HCQL的基本语法

HCQL主要包括4个部分:Select(选择)、From(从哪个表中查询)、Where(查询条件)和Order by(排序) 。

下面是一个最简单的HCQL查询:

Criteria criteria = session.createCriteria(Employee.class);
List<Employee> employees = criteria.list();
1. Select

我们可以使用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()将结果集转换成类。

2. From

使用createCriteria()方法来指定查询哪张表。此外,您还可以使用createAlias()方法在源表上建立一个别名来指向另一个表,如下所示:

Criteria criteria = session.createCriteria(Employee.class, "employee")
                .createAlias("employee.department", "department")
                .createAlias("employee.address", "address");
3. Where

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来指定条件。

4. Order By

使用addOrder()方法来指定排序的规则:

Criteria criteria = session.createCriteria(Employee.class)
                    .addOrder(Order.asc("name"))
                    .addOrder(Order.desc("salary"));
HCQL的高级特性
1. 分页查询

您可以使用setFirstResult()setMaxResults()方法来指定分页查询的页面大小和页面编号,如下所示:

Criteria criteria = session.createCriteria(Employee.class)
                    .setFirstResult(1)
                    .setMaxResults(10);
2. 复杂查询

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。