最近在項目中使用 Spring 和 Hibernate 進行開發,有感於 Criteria 比較好用,在查詢方法 設計上可以靈活的根據 Criteria 的特點來方便地進行查詢條件的組裝。現在對 Hibernate的Criteria 的用法進行總結: Hibernate 設計了 CriteriaSpecification 作為 Criteria 的父介面,下面提供了 Criteria和DetachedCriteria 。
Criteria 和 DetachedCriteria 的主要區別在於建立的形式不一樣, Criteria 是線上的,所以它是由 Hibernate Session 進行建立的;而 DetachedCriteria 是離線的,建立時無需 Session,DetachedCriteria 提供了 2 個靜態方法 forClass(Class) 或 forEntityName(Name) 進行DetachedCriteria 執行個體的建立。
Spring 的架構提供了getHibernateTemplate ().findByCriteria(detachedCriteria) 方法可以很方便地根據DetachedCriteria 來返回查詢結果。
Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 設定查詢條件。可以設 置 FetchMode( 聯集查詢抓取的模式 ) ,設定排序方式。對於 Criteria 還可以設定 FlushModel (沖刷 Session 的方式)和 LockMode (資料庫鎖模式)。下面對 Criterion 和 Projection 進行詳細說明。
Criterion 是 Criteria 的查詢條件。Criteria 提供了 add(Criterion criterion) 方法來 添加查詢條件。 Criterion 介面的主要實現包括: Example 、 Junction 和 SimpleExpression 。而 Junction 的實際使用是它的兩個子類 conjunction 和 disjunction ,分別是使用 AND 和 OR 操作符進行來連接查詢條件集合。 Criterion 的執行個體可以通過 Restrictions 工具類來建立,Restrictions 提供了大量的靜態 方法,如 eq (等於)、 ge (大於等於)、 between 等來方法的建立 Criterion 查詢條件 (SimpleExpression 執行個體)。除此之外, Restrictions 還提供了方法來建立 conjunction 和 disjunction 執行個體,通過往該執行個體的 add(Criteria) 方法來增加查詢條件形成一個查詢條件集合 。至於 Example 的建立有所不同, Example 本身提供了一個靜態方法 create(Object entity) ,即根據一個對象(實際使用中一般是映射到資料庫的對象)來建立。然後可以設定一些 過濾條件:
- Example exampleUser =Example.create(u) .ignoreCase() // 忽略大小寫
-
- .enableLike(MatchMode.ANYWHERE); // 對 String 類型的屬性,無論在那裡值在那裡都匹配。相當於 %value%
Project 主要是讓 Criteria 能夠進行報表查詢,並可以實現分組。 Project 主要有 SimpleProjection 、 ProjectionList 和 Property 三個實現。其中 SimpleProjection 和 ProjectionList 的執行個體化是由內建的 Projections 來完成,如提供的 avg 、 count 、 max 、 min 、 sum 可以讓開發人員很容易對某個欄位進行統計查詢。Property 是對某個欄位進行查詢條件的設定,如通過Porperty.forName(“color”).in (new String[]{“black”,”red”,”write”}); 則可以建立一個 Project 執行個體。通過 criteria 的 add(Project) 方法加入到查詢條件中去。 使用 Criteria 進行查詢,主要要清晰的是 Hibernate 提供了那些類和方法來滿足開發中查 詢條件的建立和組裝,下面介紹幾種用法:1. 建立一個Criteria 執行個體 org.hibernate.Criteria介面表示特定持久類的一個查詢。Session是 Criteria執行個體的工廠。
- Criteria crit = sess.createCriteria(Cat.class);
-
- crit.setMaxResults(50);
-
- List cats = crit.list();
2. 限制結果集內容一個單獨的查詢條件是org.hibernate.criterion.Criterion 介面的一個執行個體。 org.hibernate.criterion.Restrictions類 定義了獲得某些內建Criterion類型的Factory 方法。
- List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") )
-
- .add( Restrictions.between("weight", minWeight, maxWeight) ) .list();
約束可以按邏輯分組。
- List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") )
-
- .add( Restrictions.or( Restrictions.eq( "age", new Integer(0) ), Restrictions.isNull("age") ) ) .list();
-
- List cats = sess.createCriteria(Cat.class)
-
- .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
-
- .add( Restrictions.disjunction() .add( Restrictions.isNull("age") )
-
- .add( Restrictions.eq("age", new Integer(0) ) )
-
- .add( Restrictions.eq("age", new Integer(1) ) )
-
- .add( Restrictions.eq("age", new Integer(2) ) ) ) )
-
- .list();