SlideShare a Scribd company logo
Hibernate  查询
目标 掌握 Hibernate 的基本查询方法 掌握 HQL 查询 掌握标准化对象查询
Hibernate 基本查询 Hibernate 进行数据库查询非常简单 应用操作对象的方式来进行查询 使用 HQL 来设置查询条件
使用 get 方法 使用 get 方法通过持久类名和 ID 号查找一个对象 Stu instance = (Stu) getSession() .get("com.lovo.po.Stu", id);
使用 createQuery 方法 使用 createQuery 指定查询条件 String queryString = "from Stu as model where model."  + propertyName + "= ?"; Query queryObject = getSession().createQuery(queryString);  queryObject.setParameter(0, value);
配置查询条件  把查询条件放置在程序之外 , 避免硬编码 在 *.hbm.xml 中使用 <query> 标签 ,  在 <![CDATE[ code]]>  中写 HQL 语句 <query name=&quot;onlyfun.caterpillar.queryUser&quot;> <![CDATA[ select user.name from User as user where user.age = :age and user.sex = :sex ]]> </query>
使用配置查询  使用 name 属性查找配置的查询条件 Query query = session.getNamedQuery(&quot;onlyfun.caterpillar.queryUser&quot;); query.setInteger(&quot;age&quot;, 25); query.setCharacter(&quot;sex&quot;, 'M'); List names = query.list(); }
Hibernate 语言查询 Hibernate Query Language , HQL 完全面向对象的查询语句 查询功能非常强大 具备继承、多态和关联等特性  Hibernate 官方推荐使用 HQL 进行查询。
HQL HQL 用面向对象的方式生成 SQL 以类和属性来代替表和数据列 支持多态 支持各种关联 减少了 SQL 的冗余 HQL 支持所有的关系数据库操作 连接( joins, 包括 Inner/outer/full joins ),笛卡尔积 (cartesian products) 投影( projection ) 聚合( Aggregation , max, avg )和分组( group ) 排序( Ordering ) 子查询( Subqueries ) SQL 函数( SQL function calls )
使用 HQL 对表和字段的操作转化为对对象和属性的操作 HQL 查询非常类似于标准 SQL 查询  完整的 HQL 语句形势如下: Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc update/delete 为 Hibernate3 中所新添加的功能
实体查询   执行结果是,查询出 User 实体对象所对应的所有数据,而且将数据封装成 User 实体对象,并且放入 List 中返回   Hibernate 的实体查询存在着对继承关系的判定  , 查询超类 会检索出所有超类和子类类型实体对象所对应的数据 与标准 SQL 语句相似,可以在 HQL 语句中使用 where 字句,且使用各种表达式,比较操作符以及使用“ and”,”or” 连接不同的查询条件的组合  String hql=”from User user ”; List list=session.CreateQuery(hql).list(); 持久类 别名 from User user where user.age=20; from User user where user.age between 20 and 30; from User user where user.age in(20,30); from User user where user.name is null; from User user where user.name like ‘%zx%’; from User user where (user.age%2)=1; from User user where user.age=20 and user.name like ‘%zx%’;
实体的更新和删除   Hibernate3 中对更新和删除提供灵活和更具效率的解决办法  类似的方式来完成 delete 操作   Transaction trans=session.beginTransaction(); String hql=”update User user set user.age=20 where user.age=18”; Query queryupdate=session.createQuery(hql); int ret=queryupdate.executeUpdate(); trans.commit(); Transaction trans=session.beginTransaction(); String hql=”delete from User user where user.age=18”; Query queryupdate=session.createQuery(hql); int ret=queryupdate.executeUpdate(); trans.commit();
属性查询   当只需要检索实体对象的部分属性所对应的数据 时 也可以一次检索多个属性   实例化查询   ( 动态构造实例   ) List list=session.createQuery(“select user.name from User user ”).list(); List list=session.createQuery(“select user.name,user.age from User user ”).list(); List list=session.createQuery(“select new User(user.name,user.age) from User user ”).list(); 注意,这时所返回的 User 对象,仅仅只是一个普通的 Java 对象而以,除了查询结果值之外,其它的属性值都为 null (包括主键值 id ),也就是说不能通过 Session 对象对此对象执行持久化的更新操作 , 只能 save()
分组与排序   Order by 子句  , 可以通过 asc 或者 desc 关键字指定排序方式   , 默认的排序方式为 asc   Group by 子句与统计查询  标准的 SQL 聚集函数都可以在 HQL 语句中使用,比如: count(),sum(),max(),min(),avg() 等   from User user order by user.name asc,user.age desc; String hql=”select count(user),user.age from User user group by user.age having count(user)>10 ”; List list=session.createQuery(hql).list();
优化统计查询   from Customer c inner join c.orders o group by c.age;(1)   select c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID from Customer c inner join c.orders o group by c.age;(2) 语句( 1 )检索的结果会返回 Customer 与 Order 持久化对象,而且它们会被置于 Hibernate 的 Session 缓存之中  , 只有事务提交后它们才会从缓存中被清除  语句( 2 )返回的是关系数据而并非是持久化对象,因此它们不会占用 Hibernate 的 Session 缓存,只要在检索之后应用程序不在访问它们,它们所占用的内存就有可能被 JVM 的垃圾回收器回收,而且 Hibernate 不会同步对它们的修改  尽量使用通过 select 语句写出需要查询的属性的方式来返回关系数据 , 而避免使用第一种查询方式返回持久化对象(这种方式是在有修改需求时使用比较适合),这样可以提高运行效率并且减少内存消耗  name varchar2(20) age number(10) ID varchar2(14) customer customer_ID varchar2(14) order_number number(10) ID varchar2(14) order
参数绑定   传统 JDBC 的参数绑定   PrepareStatement pre=connection.prepare(“select * from User where user.name=?”); pre.setString(1,”zhao”); ResultSet rs=pre.executeQuery();
参数绑定 在 Hibernate 中共存在 4 种参数绑定的方式   按参数名称绑定 , 在语句中定义命名参数要用” :” 开头 按参数位置邦定   Query query=session.createQuery(“from User user where user.name=:customername and user.age=:customerage”);   query.setString(“customername”,name);   query.setInteger(“customerage”,age); Query query=session.createQuery(“from User user where user.name=? and user.age =? ”);   query.setString(0,name);   query.setInteger(1,age);
参数绑定 HQL 查询中可以通过 setParameter() 方法邦定任意类型的参数  可以用 query.setParameter(“customername”,name); 但是对于一些类型就必须写明映射类型,比如 java.util.Date 类型,因为它会对应 Hibernate 的多种映射类型  . 比如 Hibernate.DATA 或者 Hibernate.TIMESTAMP   String hql=”from User user where user.name=:customername ”;   Query query=session.createQuery(hql);   query.setParameter(“customername”,name,Hibernate.STRING);
参数绑定 使用 setProperties() 方法,将命名参数与一个对象的属性值绑定在一起   setProperties() 方法会自动将 customer 对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名  Customer customer=new Customer(); customer.setName(“pansl”); customer.setAge(80); Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”); query.setProperties(customer);
   使用绑定参数的优势   可以利用数据库实施性能优化,因为对 Hibernate 来说在底层使用的是 PrepareStatement 来完成查询,因此对于语法相同参数不同的 SQL 语句,可以充分利用预编译 SQL 语句缓存,从而提升查询效率   可以防止 SQL Injection 安全漏洞的产生
构建 Criteria  查询 Criteria 这个接口代表对一个特定的持久化类的查询 Session 是用来制造 Criteria 实例的工厂 Criteria criteria = session.createCriteria(Mytest.class); Criteria 对 SQL 进行封装 ,  让开发人员可以用对象的方式来对数据库进行操作 Criteria criteria = session.createCriteria(User.class); //  查询 user 所有字段 List users = criteria.list(); Iterator iterator =  users.iterator(); System.out.println(&quot;id \t name/age&quot;); while(iterator.hasNext()) { User user = (User) iterator.next();  System.out.println(user.getId() + &quot; \t &quot; + user.getName() + &quot;/&quot; + user.getAge());  }
构建 Criteria  查询 Criteria 是个容器,如果想要设定查询条件,则要使用 add() 方法加入 Restrictions 的条件限制 如下,查询 age 大于 20 且小于 40 的数据 Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt(&quot;age&quot;, new Integer(20))); criteria.add(Restrictions.lt(&quot;age&quot;, new Integer(40))); List users = criteria.list();
使用逻辑组合来进行查询 age 等于( eq ) 20 或( or ) age 为空( isNull )的条件 Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.or(  Restrictions.eq(&quot;age&quot;, new Integer(20)),  Restrictions.isNull(&quot;age&quot;)  ));  List users = criteria.list();
SQL 语法作限定查询 使用 sqlRestriction() 方法来提供 SQL 语法作限定查询例如:查询 name 以 cater 开头的数据 有多个查询条件,如 BETWEEN 子句的查询,可以如下 Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.sqlRestriction(“{ 类名 }.name LIKE (?)&quot;, &quot;cater%&quot;, Hibernate.STRING)); List users = criteria.list(); 其中 ? 将被替换为 cater% Criteria criteria = session.createCriteria(User.class); Integer[ ] ages = {new Integer(20), new Integer(40)}; Type[ ] types = {Hibernate.INTEGER, Hibernate.INTEGER}; criteria.add(Restrictions.sqlRestriction(&quot;{alias}.age BETWEEN (?) AND (?)&quot;, ages, types)); List users = criteria.list();
Restrictions 常用限定查询方法 Restrictions.eq  等于  Restrictions.allEq  使用 Map ,使用 key/value 进行多个等于的比对  Restrictions.gt  大于  >  Restrictions.ge  大于等于  >=  Restrictions.lt  小于  <  Restrictions.le  小于等于  <=  Restrictions.between  对应 SQL 的 BETWEEN 子句  Restrictions.like  对应 SQL 的 LIKE 子句  Restrictions.in  对应 SQL 的 in 子句  Restrictions.and and 关系  Restrictions.or or 关系  Restrictions.sqlRestriction SQL 限定查询
Criteria  高级特性  限定返回的记录范围   criteria. setFirstResult/setMaxResults  方法可以限制一次查询返回的记录范围 : Criteria criteria = session.createCriteria(User.class); // 限定查询返回检索结果中,从第一百条结果开始的 20 条记录  criteria.setFirstResult(100); criteria.setMaxResults(20);
Criteria  高级特性 对查询结果进行排序   // 查询所有 groupId=2 的记录  // 并分别按照姓名 ( 顺序 ) 和 groupId (逆序)排序  Criteria criteria = session.createCriteria(TUser.class); criteria.add(Expression.eq(&quot;groupId&quot;,new Integer(2))); criteria.addOrder(Order.asc(&quot;name&quot;)); criteria.addOrder(Order.desc(&quot;groupId&quot;));
Criteria  和  DetachedCriteria  Criteria  是在线的,所以它是由  Hibernate Session  进行创建的 DetachedCriteria  是离线的,创建时无需  Session   -  forClass(Class)   -  forEntityName(Name)
实例演示

More Related Content

PPT
16 hibernate criteria查询
PDF
Row Set初步学习V1.1
PPTX
J query
PPT
Qwrap jss
PPTX
iOS程序设计-数据持久化
PDF
107个常用javascript语句 oss 计算技术 - ossez info of tech
DOC
Lucene2 4学习笔记1
PDF
Java SE 7 技術手冊第五章草稿 - 何謂封裝?
16 hibernate criteria查询
Row Set初步学习V1.1
J query
Qwrap jss
iOS程序设计-数据持久化
107个常用javascript语句 oss 计算技术 - ossez info of tech
Lucene2 4学习笔记1
Java SE 7 技術手冊第五章草稿 - 何謂封裝?

What's hot (20)

PPT
14 hibernate hql查询1
DOC
Jdbc4 0 规范技术预研
PPT
关系数据库应用设计基础
PDF
jQuery底层架构
PPT
第8章 数据完整性
PPTX
Script with engine
PDF
16 CoreData
PPT
Mongo db技术分享
PDF
Java物件導向
PPTX
jQuery实践经验与技巧
PPT
组合、备忘录、建造者模式、原型
PPT
Essential oracle security internal for dba
PDF
Building an event driven web
PDF
Programming python - part 2
PDF
程式人雜誌 -- 2014 年11月號
PDF
MongoDB for C# developer
PPT
Sql语句的优化
PPT
Mongo快速入门
PPT
Js tree
PDF
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
14 hibernate hql查询1
Jdbc4 0 规范技术预研
关系数据库应用设计基础
jQuery底层架构
第8章 数据完整性
Script with engine
16 CoreData
Mongo db技术分享
Java物件導向
jQuery实践经验与技巧
组合、备忘录、建造者模式、原型
Essential oracle security internal for dba
Building an event driven web
Programming python - part 2
程式人雜誌 -- 2014 年11月號
MongoDB for C# developer
Sql语句的优化
Mongo快速入门
Js tree
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
Ad

Viewers also liked (7)

PPT
Hibernate Session 1
PPT
08 Queries
PPT
Hibernate Session 3
PPT
Hibernate Session 2
PPTX
HQL over Tiered Data Warehouse
PPT
Hibernate Session 4
PPT
Hibernate Session 1
08 Queries
Hibernate Session 3
Hibernate Session 2
HQL over Tiered Data Warehouse
Hibernate Session 4
Ad

Similar to Hibernate查询 (20)

PPT
15 hibernate hql查询2
PPT
Hibernate 映射配置文件详解
PDF
Hibernate reference
DOCX
Spring4.x + hibernate4.x_配置详解
PPT
hibernate
PPT
3 hibernate映射元素和类型
PPT
Hibernate
PPTX
Hbase orm framework simplehbase0.5 introduction
PPT
Hibernate教程
PPT
2 hibernate核心api
PPT
Struts1+ hibernate3
DOC
招聘试题
PPTX
资源竞争与并发控制
PDF
Sql培训 (1)
PDF
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
PPT
数据库原理第三章
PPT
Hibernate数据关联
PPT
Ibatis技术讲座
PPT
第6章 数据查询
PDF
Hibernate的高级操作
15 hibernate hql查询2
Hibernate 映射配置文件详解
Hibernate reference
Spring4.x + hibernate4.x_配置详解
hibernate
3 hibernate映射元素和类型
Hibernate
Hbase orm framework simplehbase0.5 introduction
Hibernate教程
2 hibernate核心api
Struts1+ hibernate3
招聘试题
资源竞争与并发控制
Sql培训 (1)
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
数据库原理第三章
Hibernate数据关联
Ibatis技术讲座
第6章 数据查询
Hibernate的高级操作

Hibernate查询

  • 2. 目标 掌握 Hibernate 的基本查询方法 掌握 HQL 查询 掌握标准化对象查询
  • 3. Hibernate 基本查询 Hibernate 进行数据库查询非常简单 应用操作对象的方式来进行查询 使用 HQL 来设置查询条件
  • 4. 使用 get 方法 使用 get 方法通过持久类名和 ID 号查找一个对象 Stu instance = (Stu) getSession() .get(&quot;com.lovo.po.Stu&quot;, id);
  • 5. 使用 createQuery 方法 使用 createQuery 指定查询条件 String queryString = &quot;from Stu as model where model.&quot; + propertyName + &quot;= ?&quot;; Query queryObject = getSession().createQuery(queryString); queryObject.setParameter(0, value);
  • 6. 配置查询条件 把查询条件放置在程序之外 , 避免硬编码 在 *.hbm.xml 中使用 <query> 标签 , 在 <![CDATE[ code]]> 中写 HQL 语句 <query name=&quot;onlyfun.caterpillar.queryUser&quot;> <![CDATA[ select user.name from User as user where user.age = :age and user.sex = :sex ]]> </query>
  • 7. 使用配置查询 使用 name 属性查找配置的查询条件 Query query = session.getNamedQuery(&quot;onlyfun.caterpillar.queryUser&quot;); query.setInteger(&quot;age&quot;, 25); query.setCharacter(&quot;sex&quot;, 'M'); List names = query.list(); }
  • 8. Hibernate 语言查询 Hibernate Query Language , HQL 完全面向对象的查询语句 查询功能非常强大 具备继承、多态和关联等特性 Hibernate 官方推荐使用 HQL 进行查询。
  • 9. HQL HQL 用面向对象的方式生成 SQL 以类和属性来代替表和数据列 支持多态 支持各种关联 减少了 SQL 的冗余 HQL 支持所有的关系数据库操作 连接( joins, 包括 Inner/outer/full joins ),笛卡尔积 (cartesian products) 投影( projection ) 聚合( Aggregation , max, avg )和分组( group ) 排序( Ordering ) 子查询( Subqueries ) SQL 函数( SQL function calls )
  • 10. 使用 HQL 对表和字段的操作转化为对对象和属性的操作 HQL 查询非常类似于标准 SQL 查询 完整的 HQL 语句形势如下: Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc update/delete 为 Hibernate3 中所新添加的功能
  • 11. 实体查询 执行结果是,查询出 User 实体对象所对应的所有数据,而且将数据封装成 User 实体对象,并且放入 List 中返回 Hibernate 的实体查询存在着对继承关系的判定 , 查询超类 会检索出所有超类和子类类型实体对象所对应的数据 与标准 SQL 语句相似,可以在 HQL 语句中使用 where 字句,且使用各种表达式,比较操作符以及使用“ and”,”or” 连接不同的查询条件的组合 String hql=”from User user ”; List list=session.CreateQuery(hql).list(); 持久类 别名 from User user where user.age=20; from User user where user.age between 20 and 30; from User user where user.age in(20,30); from User user where user.name is null; from User user where user.name like ‘%zx%’; from User user where (user.age%2)=1; from User user where user.age=20 and user.name like ‘%zx%’;
  • 12. 实体的更新和删除 Hibernate3 中对更新和删除提供灵活和更具效率的解决办法 类似的方式来完成 delete 操作 Transaction trans=session.beginTransaction(); String hql=”update User user set user.age=20 where user.age=18”; Query queryupdate=session.createQuery(hql); int ret=queryupdate.executeUpdate(); trans.commit(); Transaction trans=session.beginTransaction(); String hql=”delete from User user where user.age=18”; Query queryupdate=session.createQuery(hql); int ret=queryupdate.executeUpdate(); trans.commit();
  • 13. 属性查询 当只需要检索实体对象的部分属性所对应的数据 时 也可以一次检索多个属性 实例化查询 ( 动态构造实例 ) List list=session.createQuery(“select user.name from User user ”).list(); List list=session.createQuery(“select user.name,user.age from User user ”).list(); List list=session.createQuery(“select new User(user.name,user.age) from User user ”).list(); 注意,这时所返回的 User 对象,仅仅只是一个普通的 Java 对象而以,除了查询结果值之外,其它的属性值都为 null (包括主键值 id ),也就是说不能通过 Session 对象对此对象执行持久化的更新操作 , 只能 save()
  • 14. 分组与排序 Order by 子句 , 可以通过 asc 或者 desc 关键字指定排序方式 , 默认的排序方式为 asc Group by 子句与统计查询 标准的 SQL 聚集函数都可以在 HQL 语句中使用,比如: count(),sum(),max(),min(),avg() 等 from User user order by user.name asc,user.age desc; String hql=”select count(user),user.age from User user group by user.age having count(user)>10 ”; List list=session.createQuery(hql).list();
  • 15. 优化统计查询 from Customer c inner join c.orders o group by c.age;(1)   select c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID from Customer c inner join c.orders o group by c.age;(2) 语句( 1 )检索的结果会返回 Customer 与 Order 持久化对象,而且它们会被置于 Hibernate 的 Session 缓存之中 , 只有事务提交后它们才会从缓存中被清除 语句( 2 )返回的是关系数据而并非是持久化对象,因此它们不会占用 Hibernate 的 Session 缓存,只要在检索之后应用程序不在访问它们,它们所占用的内存就有可能被 JVM 的垃圾回收器回收,而且 Hibernate 不会同步对它们的修改 尽量使用通过 select 语句写出需要查询的属性的方式来返回关系数据 , 而避免使用第一种查询方式返回持久化对象(这种方式是在有修改需求时使用比较适合),这样可以提高运行效率并且减少内存消耗 name varchar2(20) age number(10) ID varchar2(14) customer customer_ID varchar2(14) order_number number(10) ID varchar2(14) order
  • 16. 参数绑定 传统 JDBC 的参数绑定 PrepareStatement pre=connection.prepare(“select * from User where user.name=?”); pre.setString(1,”zhao”); ResultSet rs=pre.executeQuery();
  • 17. 参数绑定 在 Hibernate 中共存在 4 种参数绑定的方式 按参数名称绑定 , 在语句中定义命名参数要用” :” 开头 按参数位置邦定 Query query=session.createQuery(“from User user where user.name=:customername and user.age=:customerage”);   query.setString(“customername”,name);   query.setInteger(“customerage”,age); Query query=session.createQuery(“from User user where user.name=? and user.age =? ”);   query.setString(0,name);   query.setInteger(1,age);
  • 18. 参数绑定 HQL 查询中可以通过 setParameter() 方法邦定任意类型的参数 可以用 query.setParameter(“customername”,name); 但是对于一些类型就必须写明映射类型,比如 java.util.Date 类型,因为它会对应 Hibernate 的多种映射类型 . 比如 Hibernate.DATA 或者 Hibernate.TIMESTAMP String hql=”from User user where user.name=:customername ”;   Query query=session.createQuery(hql);   query.setParameter(“customername”,name,Hibernate.STRING);
  • 19. 参数绑定 使用 setProperties() 方法,将命名参数与一个对象的属性值绑定在一起 setProperties() 方法会自动将 customer 对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名 Customer customer=new Customer(); customer.setName(“pansl”); customer.setAge(80); Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”); query.setProperties(customer);
  • 20.   使用绑定参数的优势 可以利用数据库实施性能优化,因为对 Hibernate 来说在底层使用的是 PrepareStatement 来完成查询,因此对于语法相同参数不同的 SQL 语句,可以充分利用预编译 SQL 语句缓存,从而提升查询效率 可以防止 SQL Injection 安全漏洞的产生
  • 21. 构建 Criteria 查询 Criteria 这个接口代表对一个特定的持久化类的查询 Session 是用来制造 Criteria 实例的工厂 Criteria criteria = session.createCriteria(Mytest.class); Criteria 对 SQL 进行封装 , 让开发人员可以用对象的方式来对数据库进行操作 Criteria criteria = session.createCriteria(User.class); // 查询 user 所有字段 List users = criteria.list(); Iterator iterator = users.iterator(); System.out.println(&quot;id \t name/age&quot;); while(iterator.hasNext()) { User user = (User) iterator.next(); System.out.println(user.getId() + &quot; \t &quot; + user.getName() + &quot;/&quot; + user.getAge()); }
  • 22. 构建 Criteria 查询 Criteria 是个容器,如果想要设定查询条件,则要使用 add() 方法加入 Restrictions 的条件限制 如下,查询 age 大于 20 且小于 40 的数据 Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt(&quot;age&quot;, new Integer(20))); criteria.add(Restrictions.lt(&quot;age&quot;, new Integer(40))); List users = criteria.list();
  • 23. 使用逻辑组合来进行查询 age 等于( eq ) 20 或( or ) age 为空( isNull )的条件 Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.or( Restrictions.eq(&quot;age&quot;, new Integer(20)), Restrictions.isNull(&quot;age&quot;) )); List users = criteria.list();
  • 24. SQL 语法作限定查询 使用 sqlRestriction() 方法来提供 SQL 语法作限定查询例如:查询 name 以 cater 开头的数据 有多个查询条件,如 BETWEEN 子句的查询,可以如下 Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.sqlRestriction(“{ 类名 }.name LIKE (?)&quot;, &quot;cater%&quot;, Hibernate.STRING)); List users = criteria.list(); 其中 ? 将被替换为 cater% Criteria criteria = session.createCriteria(User.class); Integer[ ] ages = {new Integer(20), new Integer(40)}; Type[ ] types = {Hibernate.INTEGER, Hibernate.INTEGER}; criteria.add(Restrictions.sqlRestriction(&quot;{alias}.age BETWEEN (?) AND (?)&quot;, ages, types)); List users = criteria.list();
  • 25. Restrictions 常用限定查询方法 Restrictions.eq 等于 Restrictions.allEq 使用 Map ,使用 key/value 进行多个等于的比对 Restrictions.gt 大于 > Restrictions.ge 大于等于 >= Restrictions.lt 小于 < Restrictions.le 小于等于 <= Restrictions.between 对应 SQL 的 BETWEEN 子句 Restrictions.like 对应 SQL 的 LIKE 子句 Restrictions.in 对应 SQL 的 in 子句 Restrictions.and and 关系 Restrictions.or or 关系 Restrictions.sqlRestriction SQL 限定查询
  • 26. Criteria 高级特性 限定返回的记录范围 criteria. setFirstResult/setMaxResults 方法可以限制一次查询返回的记录范围 : Criteria criteria = session.createCriteria(User.class); // 限定查询返回检索结果中,从第一百条结果开始的 20 条记录 criteria.setFirstResult(100); criteria.setMaxResults(20);
  • 27. Criteria 高级特性 对查询结果进行排序 // 查询所有 groupId=2 的记录 // 并分别按照姓名 ( 顺序 ) 和 groupId (逆序)排序 Criteria criteria = session.createCriteria(TUser.class); criteria.add(Expression.eq(&quot;groupId&quot;,new Integer(2))); criteria.addOrder(Order.asc(&quot;name&quot;)); criteria.addOrder(Order.desc(&quot;groupId&quot;));
  • 28. Criteria 和 DetachedCriteria Criteria 是在线的,所以它是由 Hibernate Session 进行创建的 DetachedCriteria 是离线的,创建时无需 Session - forClass(Class) - forEntityName(Name)