1. Hibernate检索
1.1. hibernate检索方式说明
Hibernate 提供了以下几种检索对象的方式
? 导航对象图检索方式: 根据已经加载的对象导航到其他对象 ? OID 检索方式: 按照对象的 OID 来检索对象 ? HQL 检索方式: 使用面向对象的 HQL 查询语言
? QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于
字符串形式的查询语句, 提供了更加面向对象的查询接口. ? 本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句
1.2. HQL 检索方式
HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式. 它有如下功能:
? 在查询语句中设定各种查询条件
? 支持投影查询, 即仅检索出对象的部分属性 ? 支持分页查询 ? 支持连接查询
? 支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字 ? 提供内置聚集函数, 如 sum(), min() 和 max()
? 能够调用 用户定义的 SQL 函数或标准的 SQL 函数 ? 支持子查询
? 支持动态绑定参数
HQL检索方式包括以下步骤:
? 通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语
句. HQL 查询语句中可以包含命名参数 ? 动态绑定参数
? 调用 Query 的 list() 方法执行查询语句. 该方法返回 java.util.List 类型的查询结果,
在 List 集合中存放了符合查询条件的持久化对象.
Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例, 而不是 void 类型
HQL vs SQL:
? HQL 查询语句是面向对象的, Hibernate 负责解析 HQL 查询语句, 然后根据对象-关
系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句. HQL 查询语句中的主体是域模型中的类及类的属性
? SQL 查询语句是与关系数据库绑定在一起的. SQL 查询语句中的主体是数据库表及表
的字段.
HQL的语法类似SQL语法。
1.2.1. 绑定参数
? Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL
语句功能.
? HQL 的参数绑定由两种形式:
? 按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头. ? 按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置 ? 相关方法:
? setEntity(): 把参数与一个持久化类绑定
? setParameter(): 绑定任意类型的参数. 该方法的第三个参数显式指定 Hibernate 映
射类型
绑定参数的形式,按参数名称绑定 hql 查询: Query query = session.createQuery(\ \c.name=:custname c.age=:custage\//第一个参数代表名字,第二个参数代表值 query.setString(\query.setInteger(\List list = query.list();
绑定参数的形式,按参数位置绑定
Query query = session.createQuery(\ where c.name=? and c.age=?\query.setString(0,\query.setInteger(1, 21); Query.list();
and
1.2.2. 使用别名
通过HQL检索一个类的实例时,如果查询语句的其他地方需要引用它,应该为这个类指定一个别名
from Customer as c where c.name=:custname as 可省略
1.2.3. 排序
? HQL 采用 ORDER BY 关键字对查询结果排序
hql 查询:
Query query = session.createQuery(\
QBC查询:
Criteria criteria = session.createCriteria(Customer.class); criteria.addOrder(org.hibernate.criterion.Order.asc(“id\
1.2.4. 分页查询:
? setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对
象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索
? setMaxResult(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query
和 Criteria 接口检索出查询结果中所有的对象
1.2.5. 投影查询
? 投影查询: 查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现.
? Query 的 list() 方法返回的集合中包含的是数组类型的元素, 每个对象数组代表查询结
果的一条记录
? 可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录, 使程序代码能完
全运用面向对象的语义来访问查询结果集.
? 可以通过 DISTINCT 关键字来保证查询结果不会返回重复元素
from Customer c join c.orders o where o.orderNumber like ?T%? 如果希望查询结果中只包含Customer对象,可使用以下形式: select c from Customer c join c.orders o where o.orderNumber like T%? --------------------------------------------------------------------------------- Select关键字还能用于选择对象的部分属性 session.createQuery(“select c.id,c.name,o.orderNumber from Customer c join c.orders o where o.orderNumber like ?T%?”) 对应的sql语句为: select c.ID,c.NAME,o.ORDER_NUMBER from CUSTOMERS c inner join ORDERS o on c.ID-=o.CUSTOMER_ID where o.ORDER_NUMBER like?T%? ------------------------------------------------------------------------------------ 过滤重复元素 createQuery(“select distinct c.name from customer c”);
//list集合中存放的对象数组,数组中存放的查询的部分属性 Query query = session.createQuery(\ \ join c.orders o where o.orderNumber like '%NO1%'\List list = query.list(); Iterator it = list.iterator(); while (it.hasNext()) { Object[] pair=(Object[])it.next(); Integer id=(Integer)pair[0]; String name=(String)pair[1]; String orderNumber=(String)pair[2]; System.out.print(id + \ \ \ System.out.println(\ \}
使用构造函数
相关推荐: