hibernate的高級查詢方式除了使用HQL、原生SQL的方式外,還提供了一套條件查詢的接口(QBC),其隱藏了HQL和SQL的細節,用好條件查詢,有時事半功倍,以下對常用方法做個小結。
1、創建Criteria
使用QBC查詢,首先需要創建Criteria,後面通過對Criteria追加約束完成查詢條件的設置。通過session創建,只需要通過映射的POJO類型作爲參數即可創建:
- Criteria criteria = session.createCriteria(Order.class);
2、基本條件查詢
通過創建約束Restrictions,來設置匹配條件,下面只列出幾個常用的匹配,可以參見hibernate的API有更多匹配約束
- // 基本匹配
- criteria.add(Restrictions.eq("name", nameStr));
- criteria.add(Restrictions.ge("id", 10));
- criteria.add(Restrictions.le("id", 10));
- // 模糊查詢
- criteria.add(Restrictions.like("name", nameStr));
- // 模糊查詢,不區分大小寫
- criteria.add(Restrictions.ilike("name", nameStr));
- // in匹配 OrderItemSet要求序列化,可以使用HashSet
- criteria.add(Restrictions.in("name", nameSet));
3、主鍵查詢
代理主鍵:
- criteria.add(Restrictions.idEq(10));
自然主鍵:
雖然hibernate不推薦使用,但有些業務場景的唯一標識通常是指定位數的字符序列,且會用其作爲自然主鍵。
- //自然主鍵查詢
- NaturalIdentifier identifier = Restrictions.naturalId();
- identifier.set("uuid", uuidStr);
- criteria.add(identifier);
- criteria.setCacheable(true);
- Order oredr = (Order)criteria.uniqueResult();
4、獲取記錄數
有時只想獲取記錄數,而不需要獲取整個記錄集
- criteria.setProjection(Projections.rowCount());
- long size = (Long)criteria.list().get(0);
5、設置抓取方式
在映射POJO時通常會將關聯設置爲延遲加載,即lazy=true,這樣會減少大數據抓取時的性能消耗,但有時查詢時又需要獲取關聯數據,使用QBC可以動態修改抓取策略:
- // 動態抓取設置
- criteria.setFetchMode("orderItemSet", FetchMode.JOIN);
orderItemSet 爲POJO中關係映射屬性名,例如在經典的Order和OrderItem的例子中,訂單與訂單項間的映射是一對多關係,那麼在Order的POJO中會持有一個OrderItem的聚集,通常會用一個Set,如:
- Set<OrderItem> orderItemSet = new HashSet<OrderItem>();