查询语言

    尽管你能直接使用本地 SQL 语句,但我还是建议你尽可能的使用 HQL 语句,以避免数据库关于可移植性的麻烦,并且体现了 Hibernate 的 SQL 生成和缓存策略。

    在 HQL 中一些关键字比如 SELECT ,FROM 和 WHERE 等,是不区分大小写的,但是一些属性比如表名和列名是区分大小写的。

    如果你想要在存储中加载一个完整并持久的对象,你将使用 FROM 语句。以下是 FROM 语句的一些简单的语法:

    如果你需要在 HQL 中完全限定类名,只需要指定包和类名,如下:

    1. Query query = session.createQuery(hql);
    2. List results = query.list();

    AS 语句

    在 HQL 中 AS 语句能够用来给你的类分配别名,尤其是在长查询的情况下。例如,我们之前的例子,可以用如下方式展示:

    1. String hql = "FROM Employee AS E";
    2. Query query = session.createQuery(hql);
    3. List results = query.list();

    关键字 AS 是可选择的并且你也可以在类名后直接指定一个别名,如下:

    1. Query query = session.createQuery(hql);
    2. List results = query.list();

    SELECT 语句

    1. String hql = "SELECT E.firstName FROM Employee E";
    2. Query query = session.createQuery(hql);
    3. List results = query.list();

    值得注意的是 Employee.firstName 是 Employee 对象的属性,而不是一个 EMPLOYEE 表的字段。

    WHERE 语句

    如果你想要精确地从数据库存储中返回特定对象,你需要使用 WHERE 语句。下面是 WHERE 语句的简单语法例子:

    为了给 HSQ 查询结果进行排序,你将需要使用 ORDER BY 语句。你能利用任意一个属性给你的结果进行排序,包括升序或降序排序。下面是一个使用 ORDER BY 语句的简单示例:

    1. String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
    2. Query query = session.createQuery(hql);
    3. List results = query.list();

    如果你想要给多个属性进行排序,你只需要在 ORDER BY 语句后面添加你要进行排序的属性即可,并且用逗号进行分割:

    1. "ORDER BY E.firstName DESC, E.salary DESC ";
    2. Query query = session.createQuery(hql);
    3. List results = query.list();

    GROUP BY 语句

    这一语句允许 Hibernate 将信息从数据库中提取出来,并且基于某种属性的值将信息进行编组,通常而言,该语句会使用得到的结果来包含一个聚合值。下面是一个简单的使用 GROUP BY 语句的语法:

    1. String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
    2. "GROUP BY E.firstName";
    3. Query query = session.createQuery(hql);
    4. List results = query.list();

    使用命名参数

    Hibernate 的 HQL 查询功能支持命名参数。这使得 HQL 查询功能既能接受来自用户的简单输入,又无需防御 SQL 注入攻击。下面是使用命名参数的简单的语法:

    1. String hql = "FROM Employee E WHERE E.id = :employee_id";
    2. Query query = session.createQuery(hql);
    3. List results = query.list();

    UPDATE 语句

    UPDATE 语句能够更新一个或多个对象的一个或多个属性。下面是使用 UPDATE 语句的简单的语法:

    DELETE 语句可以用来删除一个或多个对象。以下是使用 DELETE 语句的简单语法:

    1. String hql = "DELETE FROM Employee " +
    2. "WHERE id = :employee_id";
    3. Query query = session.createQuery(hql);
    4. int result = query.executeUpdate();
    5. System.out.println("Rows affected: " + result);

    INSERT 语句

    HQL 只有当记录从一个对象插入到另一个对象时才支持 INSERT INTO 语句。下面是使用 INSERT INTO 语句的简单的语法:

    1. String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
    2. "SELECT firstName, lastName, salary FROM old_employee";
    3. Query query = session.createQuery(hql);
    4. int result = query.executeUpdate();
    5. System.out.println("Rows affected: " + result);

    聚合方法

    HQL 类似于 SQL,支持一系列的聚合方法,它们以同样的方式在 HQL 和 SQL 中工作,以下列出了几种可用方法:

    distinct 关键字表示只计算行集中的唯一值。下面的查询只计算唯一的值:

    1. String hql = "SELECT count(distinct E.firstName) FROM Employee E";
    2. Query query = session.createQuery(hql);
    3. List results = query.list();

    使用分页查询

    以下为两种分页查询界面的方法:

    S.N. 方法&描述
    1 Query setFirstResult(int startPosition) 该方法以一个整数表示结果中的第一行,从 0 行开始。
    2 Query setMaxResults(int maxResult) 这个方法告诉 Hibernate 来检索固定数量,即 maxResults 个对象。
    1. String hql = "FROM Employee";
    2. Query query = session.createQuery(hql);
    3. query.setFirstResult(1);