Hibernate-Criteria 模糊查询(转自http://www.cn-java.com/www1/?uid-564442-action-viewsp)

  Criteria Query通过面向对象化的设计,将数据查询条件封装为一个对象。简单来
  
   讲,Criteria Query可以看作是传统SQL的对象化表示,如:
  
   Criteria criteria = session.createCriteria(User.class);
  
   criteria.add(Expression.eq("name","Erica"));
  
   criteria.add(Expression.eq("sex",new Integer(1)));
  
   这里的criteria 实例实际上是SQL “Select * from t_user where
  
   name=’Erica’ and sex=1”的封装(我们可以打开Hibernate 的show_sql 选项,
  
   以观察Hibernate在运行期生成的SQL语句)。
  
   Hibernate 在运行期会根据Criteria 中指定的查询条件(也就是上面代码中通过
  
   criteria.add方法添加的查询表达式)生成相应的SQL语句。
  
   这种方式的特点是比较符合Java 程序员的编码习惯,并且具备清晰的可读性。正因
  
   为此,不少ORM实现中都提供了类似的实现机制(如Apache OJB)。
  
   对于Hibernate的初学者,特别是对SQL了解有限的程序员而言,Criteria Query
  
   无疑是上手的极佳途径,相对HQL,Criteria Query提供了更易于理解的查询手段,借
  
   助IDE的Coding Assist机制,Criteria的使用几乎不用太多的学习。
  
   Criteria 查询表达式
  
   Criteria 本身只是一个查询容器,具体的查询条件需要通过Criteria.add
  
   方法添加到Criteria实例中。
  
   如前例所示,Expression 对象具体描述了查询条件。针对SQL 语法,
  
   Expression提供了对应的查询限定机制,包括:
  
   方法 描述
  
   Expression.eq 对应SQL“field = value”表达式。
  
   如Expression.eq("name","Erica")
  
   Expression.allEq 参数为一个Map对象,其中包含了多个属性-值对
  
   应关系。相当于多个Expression.eq关系的叠加。
  
   Expression.gt 对应SQL中的 “field > value ” 表达式
  
   Expression.ge 对应SQL中的 “field >= value” 表达式
  
   Expression.lt 对应SQL中的 “field < value” 表达式
  
   Expression.le 对应SQL中的 “field <= value” 表达式
  
   Expression.between 对应SQL中的 “between” 表达式
  
   如下面的表达式表示年龄(age)位于13到50区间内。
  
   Expression.between("age",new
  
   Integer(13),new Integer(50));
  
   表达式
  
   Expression.in 对应SQL中的 ”field in …” 表达式
  
   Expression.eqProperty 用于比较两个属性之间的值,对应SQL中的“field = field”。
  
   如:
  
   Expression.eqProperty(
  
   "TUser.groupID",
  
   "TGroup.id"
  
   );
  
   Expression.gtProperty 用于比较两个属性之间的值,对应SQL中的“field > field”。
  
   Expression.geProperty 用于比较两个属性之间的值,对应SQL中的“field >= field”。
  
   Expression.ltProperty 用于比较两个属性之间的值,对应SQL中的“field < field”。
  
   Expression.leProperty 用于比较两个属性之间的值,对应SQL中的“field <= field”。
  
   Expression.and and关系组合。
  
   如:
  
   Expression.and(
  
   Expression.eq("name","Erica"),
  
   Expression.eq(
  
   "sex",
  
   new Integer(1)
  
   )
  
   );
  
   Expression.or or关系组合。
  
   如:
  
   Expression.or(
  
   Expression.eq("name","Erica"),
  
   Expression.eq("name","Emma")
  
   );
  
   Expression.sql 作为补充,本方法提供了原生SQL语法的支持。我
  
   们可以通过这个方法直接通过SQL语句限定查询条件。
  
   下面的代码返回所有名称以“Erica”起始的记录:
  
   Expression.sql(
  
   “lower({alias}.name) like lower(?)”,
  
   "Erica%",
  
   Hibernate.STRING
  
   );
  
   其中的“{alias}”将由Hibernate在运行期使
  
   用当前关联的POJO别名替换。
  
   注意Expression 各方法中的属性名参数(如Express.eq中的第一个参数),这里
  
   所谓属性名是POJO中对应实际库表字段的属性名(大小写敏感),而非库表中的实
  
   际字段名称。
  
   Criteria 高级特性
  
   限定返回的记录范围
  
   通过criteria. setFirstResult/setMaxResults 方法可以限制一次查询返回
  
   的记录范围:
  
   Criteria criteria = session.createCriteria(TUser.class);
  
   //限定查询返回检索结果中,从第一百条结果开始的20条记录
  
   criteria.setFirstResult(100);
  
   criteria.setMaxResults(20);
  
   对查询结果进行排序
  
   //查询所有groupId=2的记录
  
   //并分别按照姓名(顺序)和groupId(逆序)排序
  
   Criteria criteria = session.createCriteria(TUser.class);
  
   criteria.add(Expression.eq("groupId",new Integer(2)));
  
   criteria.addOrder(Order.asc("name"));
  
   criteria.addOrder(Order.desc("groupId"));
  
  
  
   Criteria作为一种对象化的查询封装模式,不过由于Hibernate在实现过程中将精力
  
   更加集中在HQL查询语言上,因此Criteria的功能实现还没做到尽善尽美(这点上,OJB
  
   的Criteria 实现倒是值得借鉴),因此,在实际开发中,建议还是采用Hibernate 官
  
   方推荐的查询封装模式:HQL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值