📅  最后修改于: 2020-11-16 07:01:15             🧑  作者: Mango
休眠查询语言(HQL)是一种面向对象的查询语言,与SQL相似,但它不是对表和列进行操作,而是与持久对象及其属性一起使用。 Hibernate将HQL查询转换为常规的SQL查询,这些查询又对数据库执行操作。
虽然您可以使用Native SQL将SQL语句直接与Hibernate一起使用,但是我建议尽可能使用HQL,以避免数据库可移植性的麻烦,并利用Hibernate的SQL生成和缓存策略。
诸如SELECT,FROM和WHERE等的关键字不区分大小写,但在HQL中,表和列名之类的属性区分大小写。
如果要将完整的持久对象加载到内存中,将使用FROM子句。以下是使用FROM子句的简单语法-
String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
如果您需要完全限定HQL中的类名,只需指定包和类名,如下所示-
String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();
AS子句可用于为HQL查询中的类分配别名,尤其是在查询较长的情况下。例如,我们之前的简单示例如下:
String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
AS关键字是可选的,您还可以在类名之后直接指定别名,如下所示:
String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
与from子句相比, SELECT子句提供了对结果集的更多控制。如果要获取对象的少量属性而不是完整的对象,请使用SELECT子句。以下是使用SELECT子句仅获取Employee对象的first_name字段的简单语法-
String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
这里值得注意的是, Employee.firstName是Employee对象的属性,而不是EMPLOYEE表的字段。
如果要缩小从存储返回的特定对象,请使用WHERE子句。以下是使用WHERE子句的简单语法-
String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();
要对HQL查询的结果进行排序,您将需要使用ORDER BY子句。您可以对结果集中的对象的任何属性进行升序(ASC)或降序(DESC)。以下是使用ORDER BY子句的简单语法-
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();
如果要按多个属性排序,则只需将其他属性添加到order by子句的末尾,并以逗号分隔,如下所示:
String hql = "FROM Employee E WHERE E.id > 10 " +
"ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
该子句允许Hibernate从数据库中提取信息,并根据属性的值对信息进行分组,并且通常使用结果包括总值。以下是使用GROUP BY子句的简单语法-
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
"GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();
Hibernate在其HQL查询中支持命名参数。这使得编写接受用户输入的HQL查询变得容易,并且您不必防御SQL注入攻击。以下是使用命名参数的简单语法-
String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();
批量更新是Hibernate 3中HQL的新增功能,在Hibernate 3中删除工作的方式与在Hibernate 2中进行删除的方式不同。查询接口现在包含一个称为executeUpdate()的方法,用于执行HQL UPDATE或DELETE语句。
UPDATE子句可用于更新一个或多个对象的一个或多个属性。以下是使用UPDATE子句的简单语法-
String hql = "UPDATE Employee set salary = :salary " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
DELETE子句可用于删除一个或多个对象。以下是使用DELETE子句的简单语法-
String hql = "DELETE FROM Employee " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
HQL仅在可以将记录从一个对象插入到另一个对象的情况下才支持INSERT INTO子句。以下是使用INSERT INTO子句的简单语法-
String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
"SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
HQL支持多种聚合方法,类似于SQL。它们在HQL中的工作方式与在SQL中的工作方式相同,以下是可用功能的列表-
Sr.No. | Functions & Description |
---|---|
1 |
avg(property name) The average of a property’s value |
2 |
count(property name or *) The number of times a property occurs in the results |
3 |
max(property name) The maximum value of the property values |
4 |
min(property name) The minimum value of the property values |
5 |
sum(property name) The sum total of the property values |
DISTINCT关键字只计算行集中的唯一值。以下查询将仅返回唯一计数-
String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
查询接口有两种分页方法。
Sr.No. | Method & Description |
---|---|
1 |
Query setFirstResult(int startPosition) This method takes an integer that represents the first row in your result set, starting with row 0. |
2 |
Query setMaxResults(int maxResult) This method tells Hibernate to retrieve a fixed number maxResults of objects. |
结合使用以上两种方法,我们可以在Web或Swing应用程序中构造一个分页组件。以下是示例,您可以扩展为一次获取10行-
String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();