Hibernate4之Criteria接口QBC方式…

本文详细介绍了Hibernate Criteria API 的使用方法,包括分页查询、条件查询、排序及动态关联抓取等功能,并探讨了其在实际应用中的优缺点。
分页查询
Java代码 复制代码  收藏代码Hibernate4之Criteria接口QBC方式查询
  1. Criteria crit session.createCriteria(Order.class).setMaxResults(10).setFirstResult(1);   
  2. crit.list();  
Criteria crit = session.createCriteria(Order.class).setMaxResults(10).setFirstResult(1);
crit.list();


条件查询
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例org.hibernate.criterion.Restrictions类定义了获得某些内置Criterion类型的工厂方法。

Java代码 复制代码  收藏代码Hibernate4之Criteria接口QBC方式查询
  1. //Restrictions.like和Restrictions.eq用法   
  2. List list s.createCriteria(UserModel.class)     
  3.              .add(Restrictions.eq("uuid", "3"))     
  4.              .add(Restrictions.like("name", "%n%")).list();     
  5.   
  6. //Restrictions.or和Restrictions.isNull用法   
  7. List cats s.createCriteria(Cat.class)     
  8.              .add(Restrictions.like("name", "Fritz%")     
  9.              .add(Restrictions.or(Restrictions.eq("age",new Integer(0)),     
  10.                   Restrictions.isNull("age"))).list();   
  11.   
  12. //Restrictions.lt和Restrictions.in用法   
  13. List cats s.createCriteria(Cat.class)    
  14.              .add(Restrictions.in("name",new String[]{"Fritz", "Izi","Pk"}))    
  15.              .add(   
  16.                   Restrictions.disjunction().add(Restrictions.isNull("age"))    
  17.                   .add(Restrictions.lt("age", new Integer(100))) //小于   
  18.                   .add(Restrictions.le("age", new Integer(0))) //小于或等于   
  19.                   .add(Restrictions.gt("age", new Integer(0))) //大于   
  20.                   .add(Restrictions.ge("age", new Integer(1))) //大于或等于   
  21.                   .add(Restrictions.eq("age", new Integer(2))))).list();   
//Restrictions.like和Restrictions.eq用法
List list = s.createCriteria(UserModel.class)  
             .add(Restrictions.eq("uuid", "3"))  
             .add(Restrictions.like("name", "%n%")).list();  

//Restrictions.or和Restrictions.isNull用法
List cats = s.createCriteria(Cat.class)  
             .add(Restrictions.like("name", "Fritz%") )  
             .add(Restrictions.or(Restrictions.eq("age",new Integer(0)),  
                  Restrictions.isNull("age"))).list();

//Restrictions.lt和Restrictions.in用法
List cats = s.createCriteria(Cat.class) 
             .add(Restrictions.in("name",new String[]{"Fritz", "Izi","Pk"})) 
             .add(
                  Restrictions.disjunction().add(Restrictions.isNull("age")) 
                  .add(Restrictions.lt("age", new Integer(100))) //小于
                  .add(Restrictions.le("age", new Integer(0))) //小于或等于
                  .add(Restrictions.gt("age", new Integer(0))) //大于
                  .add(Restrictions.ge("age", new Integer(1))) //大于或等于
                  .add(Restrictions.eq("age", new Integer(2))))).list(); 


排序
可以使用 org.hibernate.criterion.Order 来为查询结果排序。示例如下:

Java代码 复制代码  收藏代码Hibernate4之Criteria接口QBC方式查询
  1. List cats s.createCriteria(Cat.class)     
  2.              .add(Restrictions.like("name", "F%"))   
  3.              .addOrder(Order.asc("name")     
  4.              .addOrder(Order.desc("age")     
  5.              .setMaxResults(50)     
  6.              .list();   
  7.   
  8. List cats s.createCriteria(Cat.class)   
  9.              .add(Property.forName("name").like("F%"))   
  10.              .addOrder(Property.forName("name").asc())   
  11.              .addOrder(Property.forName("age").desc())   
  12.              .setMaxResults(50)   
  13.              .list();   
  14.   
  15. //Restrictions.between用法   
  16. List list session.createCriteria(StockDailyRecord.class).add(Restrictions.between("date", startDate, endDate)).list();  
List cats = s.createCriteria(Cat.class)  
             .add(Restrictions.like("name", "F%"))
             .addOrder(Order.asc("name") )  
             .addOrder(Order.desc("age") )  
             .setMaxResults(50)  
             .list();

List cats = s.createCriteria(Cat.class)
             .add(Property.forName("name").like("F%"))
             .addOrder(Property.forName("name").asc())
             .addOrder(Property.forName("age").desc())
             .setMaxResults(50)
             .list();

//Restrictions.between用法
List list = session.createCriteria(StockDailyRecord.class).add(Restrictions.between("date", startDate, endDate)).list();


动态关联抓取
Java代码 复制代码  收藏代码Hibernate4之Criteria接口QBC方式查询
  1. List cats s.createCriteria(Cat.class)    
  2.              .add( Restrictions.like("name", "Fritz%")    
  3.              .setFetchMode("mate", FetchMode.EAGER)    
  4.              .setFetchMode("kittens", FetchMode.EAGER)    
  5.              .list();  
List cats = s.createCriteria(Cat.class) 
             .add( Restrictions.like("name", "Fritz%") ) 
             .setFetchMode("mate", FetchMode.EAGER) 
             .setFetchMode("kittens", FetchMode.EAGER) 
             .list();



Criteria的缺点


Criteria API同时也带有一些缺点。
1、性能问题
没有办法控制由Hibernate生成的SQL查询语句,如果生成的查询语句很慢,我们很难调整,数据库管理员可能非常不喜欢这样。

2、维护问题
所有的SQL查询散布在Java代码中,当一个查询出现错误时,我们可能需要花费大量的时间来找出问题所在。换句话说,存储在Hibernate映射文件中的命名查询更容易去维护。
结论

没有什么东西是完美的,考虑我们项目的需要,明智地使用它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值