概述

•Hibernate 提供了以下几种检索对象的方式
  –导航对象图检索方式:  根据已经加载的对象导航到其他对象
  –OID 检索方式:  按照对象的 OID 来检索对象
  –HQL 检索方式: 使用面向对象的 HQL 查询语言
  –QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口.
  –本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句

HQL 检索方式

  HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式.

•HQL 检索方式包括以下步骤:

  –通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名参数
  –动态绑定参数
  –调用 Query 相关方法执行查询语句.

Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例, 而不是 void 类型

•HQL vs SQL:

  –HQL 查询语句是面向对象的, Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句. HQL 查询语句中的主体是域模型中的类及类的属性
  –SQL 查询语句是与关系数据库绑定在一起的. SQL 查询语句中的主体是数据库表及表的字段.

•绑定参数:

  –Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL 语句功能.

  –HQL 的参数绑定由两种形式:

    •按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头.
    •按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置
  –相关方法:
    •setEntity(): 把参数与一个持久化类绑定
    •setParameter(): 绑定任意类型的参数. 该方法的第三个参数显式指定 Hibernate 映射类型

•HQL 采用 ORDER BY 关键字对查询结果排序

 1     public void testHQL(){
 2         //1. 创建 Query 对象
 3         //基于位置的参数. 
 4         String hql = "FROM Employee e WHERE e.salary > ? AND e.email LIKE ? AND e.dept = ? "
 5                 + "ORDER BY e.salary";
 6         Query query = session.createQuery(hql);
 7         
 8         //2. 绑定参数
 9         //Query 对象调用 setXxx 方法支持方法链的编程风格.
10         Department dept = new Department();
11         dept.setId(80); 
12         query.setFloat(0, 6000)
13              .setString(1, "%A%")
14              .setEntity(2, dept);
15         
16         //3. 执行查询
17         List<Employee> emps = query.list();
18         System.out.println(emps.size());  
19     }
testHQL1
 1     public void testHQLNamedParameter(){
 2         //1. 创建 Query 对象
 3         //基于命名参数. 
 4         String hql = "FROM Employee e WHERE e.salary > :sal AND e.email LIKE :email";
 5         Query query = session.createQuery(hql);
 6         
 7         //2. 绑定参数
 8         query.setFloat("sal", 7000)
 9              .setString("email", "%A%");
10         
11         //3. 执行查询
12         List<Employee> emps = query.list();
13         System.out.println(emps.size());  
14     }
testHQL2

•分页查询:

  –setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索
  –setMaxResults(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象

相关文章:

  • 2021-12-27
  • 2021-05-27
  • 2022-01-06
  • 2022-02-09
  • 2021-12-12
  • 2021-10-11
  • 2022-12-23
  • 2021-05-05
猜你喜欢
  • 2021-07-21
  • 2022-12-23
  • 2021-11-26
  • 2022-12-23
  • 2021-09-13
  • 2021-06-08
  • 2022-12-23
相关资源
相似解决方案