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>(); 

 

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