QBC查询方法小结

 hibernate的高级查询方式除了使用HQL、原生SQL的方式外,还提供了一套条件查询的接口(QBC),其隐藏了HQL和SQL的细节,用好条件查询,有时事半功倍,以下对常用方法做个小结。

1、创建Criteria

使用QBC查询,首先需要创建Criteria,后面通过对Criteria追加约束完成查询条件的设置。通过session创建,只需要通过映射的POJO类型作为参数即可创建:

  1. Criteria criteria = session.createCriteria(Order.class); 

2、基本条件查询

通过创建约束Restrictions,来设置匹配条件,下面只列出几个常用的匹配,可以参见hibernate的API有更多匹配约束

  1. // 基本匹配 
  2. criteria.add(Restrictions.eq("name", nameStr)); 
  3. criteria.add(Restrictions.ge("id"10)); 
  4. criteria.add(Restrictions.le("id"10)); 
  5.          
  6. // 模糊查询 
  7. criteria.add(Restrictions.like("name", nameStr)); 
  8.          
  9. // 模糊查询,不区分大小写 
  10. criteria.add(Restrictions.ilike("name", nameStr)); 
  11.          
  12. // in匹配 OrderItemSet要求序列化,可以使用HashSet 
  13. criteria.add(Restrictions.in("name", nameSet)); 

3、主键查询

代理主键:

  1. criteria.add(Restrictions.idEq(10)); 

自然主键:

虽然hibernate不推荐使用,但有些业务场景的唯一标识通常是指定位数的字符序列,且会用其作为自然主键。

  1. //自然主键查询 
  2. NaturalIdentifier identifier = Restrictions.naturalId(); 
  3. identifier.set("uuid", uuidStr); 
  4. criteria.add(identifier); 
  5. criteria.setCacheable(true); 
  6. Order oredr = (Order)criteria.uniqueResult(); 

4、获取记录数

有时只想获取记录数,而不需要获取整个记录集

  1. criteria.setProjection(Projections.rowCount()); 
  2. long size = (Long)criteria.list().get(0); 

5、设置抓取方式

在映射POJO时通常会将关联设置为延迟加载,即lazy=true,这样会减少大数据抓取时的性能消耗,但有时查询时又需要获取关联数据,使用QBC可以动态修改抓取策略:

  1. // 动态抓取设置 
  2. criteria.setFetchMode("orderItemSet", FetchMode.JOIN); 

orderItemSet 为POJO中关系映射属性名,例如在经典的Order和OrderItem的例子中,订单与订单项间的映射是一对多关系,那么在Order的POJO中会持有一个OrderItem的聚集,通常会用一个Set,如:

  1. Set<OrderItem> orderItemSet = new HashSet<OrderItem>(); 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章