-
HQL 查询;
-
Criteria 条件查询(hibernate 5.x 已经废弃);
- SQL 查询;
Hibernate HQL查询
HQL(Hibernate Query Language)是Hibernate提供的一种面向对象的查询语言,语法类似于SQL;
SQL 的操作对象是数据表、列等数据库对象,HQL 的操作对象是类、实例、属性等;
HQL 的基本使用
HQL 查询依赖于 Query 类,每一个 Query 对应一个查询对象; Query 类支持链式调用,常用的 API 如下:基本示例 其中实体 Users 的建模如下:
HQL语句模板和参数设置
HQL语句一般使用模板的方式编写,以提高灵活性,类似与 JDBC 中的PreparedStatement ,当然也可以直接填写参数;
HQL 模板的占位符 有2种方式,一种为 “:N” 占位符(N为参数变量),一种为“?”占位符;
Query 返回结果列表
Query 返回的结果是以 List<Object> 的方式返回,返回List中的每一个 Object 对应一条查询结果记录; 这个 Object 可以是一个PO持久化实体(在查询结果可以转化为某个PO持久化实体时),也可以是一个包含所有返回属性的 Object[] 数组,如以上基本示例中的2个示例;
HQL 的基本语法
HQL 语句的语法基本类似于SQL,大部分 SQL99 中的关键字可以通用于 HQL 语句,HQL支持以下语法: 这些语法和 SQL99 中是基本一样的; 示例
HQL 中的聚合函数
HQL 支持在选出的属性上使用聚合函数,这些函数和SQL中的完全相同,如:avg ,count,max,min,sum;
示例:
HQL 中的条件表达式
HQL where子句中支持 SQL 的所有运算符,同时也支持 EJB-QL 的运算符;关联连接
HQL 支持两种方式的关联连接(join)方式:隐式(implict)、显式(explict); 在使用时优先推荐使用显式连接,隐式连接在 hibernate 3.2 之后 只能自动作用与普通的组件属性和1-1的关联实体,对于1-N、N-N的关联实体只能通过显式连接,隐式连接直接通过"."调用关联对象,底层会自动转化为 SQL99 的 交叉连接; 以下介绍显式连接:1)关联连接类型:
-
inner join / join : 内连接
-
left join:左外连接
-
right join:右外链接
-
full join:全连接
2)关联连接基本语法 示例:
3)解决关联实体延迟加载的问题
对于集合属性,hibernate 默认采用延迟加载的策略。比如User中含有一个集合属性 articles,当User被加载时,默认不加载 articles,当 User 所在的 Session 被关闭时,User的实例将无法访问其关联的 articles。为了解决这个问题,有两种方式: ① 在关联实体的注解标签中,设置属性 fetch=FetchType.EAGER; ② 在相关的HQL中使用 fetch 关键字,如下: ※ fetch 关键字无法与 Query.setMaxResults() ,Query.setFirstResults() 方法共用; ※ full join fetch ,right join fetch 没有任何意义;
子查询
HQL 提供的子查询语法类似于 SQL,类似如下:HQL 命名查询
Hibernate 支持将 HQL 语句放置到持久化实体的注解中,通过这种方式能进一步提高程序的解耦; 命名查询使用 @NamedQuery 标签,可以将多个 @NamedQuery 放置到一个 @NamedQueries 中 ,示例使用如下: User.java Test.java
DML风格的批量更新/删除
HQL 语句除了可以用于查询外,也可以用与批量 update,insert,如下: