Hibernate的查询 标准(Criteria)查询

一个简单例子:

Java代码    收藏代码
  1. @SuppressWarnings("unchecked")  
  2. public void searchByPropertys() {  
  3.     Session session = this.getSession();  
  4.     Criteria crit = session.createCriteria(Conft.class);  
  5.     List<Conft> list = crit.list();  
  6.     for(Conft c : list){  
  7.         System.out.println(c.getId());  
  8.     }  
  9. }  

 

标准查询API最终仍然翻译为SQL交由数据库处理,返回java.util.List对象

 

怎么增加条件呢?请看如下代码:

Java代码    收藏代码
  1. public void searchByPropertys() {  
  2.     Session session = this.getSession();  
  3.     Criteria crit = session.createCriteria(Conft.class);      
  4.     crit.add(Restrictions.eq("id"2)); // =  
  5.     crit.add(Restrictions.ne("id"2)); // !=  
  6.     crit.add(Restrictions.lt("id"2)); // <  
  7.     crit.add(Restrictions.gt("id"2)); // >  
  8.     crit.add(Restrictions.le("id"2)); // <=  
  9.     crit.add(Restrictions.ge("id"2)); // >=  
  10.     crit.add(Restrictions.in("id"new String[]{"2"})); // in  
  11.     crit.add(Restrictions.like("id""%2%")); // like  
  12.     crit.add(Restrictions.like("id""2",MatchMode.ANYWHERE)); // %x%  
  13.     crit.add(Restrictions.like("id""2",MatchMode.START)); // x%  
  14.     crit.add(Restrictions.like("id""2",MatchMode.END)); // %x  
  15.     crit.add(Restrictions.like("id""2",MatchMode.EXACT)); // x      
  16.     List<Conft> list = crit.list();  
  17.     for(Conft c : list){  
  18.         System.out.println(c.getId());  
  19.     }  
  20. }  

 

代码后面写出了增加条件的方式和意思。

 

如果有and或者是or的关系的话,可以使用Conjunction(AND)和Disjunction(OR)!

下面是一个使用示例:

Java代码    收藏代码
  1. public void searchByPropertys() {  
  2.     Session session = this.getSession();  
  3.     Criteria crit = session.createCriteria(Conft.class);  
  4.     // 创建条件  
  5.     Criterion a = Restrictions.gt("id"2); // >  
  6.     Criterion b = Restrictions.lt("id"2); // <  
  7.     Criterion c = Restrictions.like("id""2",MatchMode.ANYWHERE);  
  8.     // and 关系  
  9.     Conjunction conjunction = Restrictions.conjunction();  
  10.     conjunction.add(a);  
  11.     conjunction.add(b);  
  12.     // or 关系  
  13.     Disjunction disjunction = Restrictions.disjunction();  
  14.     disjunction.add(conjunction);  
  15.     disjunction.add(c);   
  16.     // 增加查询条件  
  17.     crit.add(disjunction);    
  18.     List<Conft> list = crit.list();  
  19.     for(Conft conft : list){  
  20.         System.out.println(conft.getId());  
  21.     }  
  22. }  

 

a和b是AND关系,而a和b合起来作为条件后和c是OR关系!

如果看他的SQL的话,是这样的,有助于理解:

Java代码    收藏代码
  1. (where (a>? and b<?) or c like ?)  

 

除此之外还可以使用sqlRestriction方法直接拼接SQL

Java代码    收藏代码
  1. public User getUserById(int pk){  
  2.     Session session = this.getSession();  
  3.     Criteria crit = session.createCriteria(User.class);  
  4.     crit.add(Restrictions.sqlRestriction(" {alias}.id=2 "));  
  5.     List<User> list = crit.list();  
  6.     return (User)list.get(0);  
  7. }  

 

注意{alias}是表的名称,这个不用修改,Hibernate在生成SQL时会自动替换!

在源码中可以看到:

Java代码    收藏代码
  1. public static Criterion sqlRestriction(String sql, Object values[], Type types[])  
  2. {  
  3.     return new SQLCriterion(sql, values, types);  
  4. }  
  5. public static Criterion sqlRestriction(String sql, Object value, Type type)  
  6. {  
  7.     return new SQLCriterion(sql, new Object[] {  
  8.         value  
  9.     }, new Type[] {  
  10.         type  
  11.     });  
  12. }  
  13. public static Criterion sqlRestriction(String sql)  
  14. {  
  15.     return new SQLCriterion(sql, ArrayHelper.EMPTY_OBJECT_ARRAY, ArrayHelper.EMPTY_TYPE_ARRAY);  
  16. }  

 

也就是说这个方法有三个调用方式,直接写SQL,如果你的SQL中有 ? 作为占位符,那么可设置后面两个参数,第二个参数对应 ? ,第三个是参数字段的类型!

如果有多个 ? ,那么第二和第三个参数就要用数组的形式来传递!


更多信息请查看 java教程网  www.itchm.com

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值