本文轉載自 : http://penghao122.javaeye.com/blog/80794 1、創建一個Criteria實例 net.sf.hibernate.Criteria這個接口代表對一個特定的持久化類的查詢。Session是用來制造Criteria實例的工廠。
- Criteria crit = sess.createCriteria(Cat.class);
- crit.setMaxResults(50);
- List cats = crit.list();
2、縮小結果集范圍 一個查詢條件(Criterion)是net.sf.hibernate.expression.Criterion接口的一個實例。類
net.sf.hibernate.expression.Expression定義了獲得一些內置的Criterion類型。
- List cats = sess.createCriteria(Cat.class)
- .add( Expression.like("name", "Fritz%") )
- .add( Expression.between("weight", minWeight, maxWeight))
- .list();
- 表達式(Expressions)可以按照邏輯分組.
- List cats = sess.createCriteria(Cat.class)
- .add( Expression.like("name", "Fritz%") )
- .add( Expression.or( Expression.eq( "age", new Integer(0) ), Expression.isNull("age")))
- .list();
- List cats = sess.createCriteria(Cat.class)
- .add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
- .add( Expression.disjunction()
- .add( Expression.isNull("age") )
- .add( Expression.eq("age", new Integer(0) ) )
- .add( Expression.eq("age", new Integer(1) ) )
- .add( Expression.eq("age", new Integer(2) ) ) ) )
- .list();
- 有很多預制的條件類型(Expression的子類)。有一個特別有用,可以讓你直接嵌入SQL。
- List cats = sess.createCriteria(Cat.class)
- .add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
- .list();
- 其中的{alias}是一個占位符,它將會被所查詢實體的行別名所替代。
- (原文:The {alias} placeholder with be replaced by the row alias of the queried entity.)
- 3、對結果排序 可以使用net.sf.hibernate.expression.Order對結果集排序. <pre class="java" name="code">List cats = sess.createCriteria(Cat.class)
- .add( Expression.like("name", "F%")
- .addOrder( Order.asc("name"))
- .addOrder( Order.desc("age"))
- .setMaxResults(50)
- .list(); </pre>
- 4、關聯(Associations) 你可以在關聯之間使用createCriteria(),很容易地在存在關系的實體之間指定約束。
- <pre class="java" name="code">List cats = sess.createCriteria(Cat.class)
- .add( Expression.like("name", "F%")
- .createCriteria("kittens")
- .add( Expression.like("name","F%")
- .list(); </pre>
- 注意,第二個createCriteria()返回一個Criteria的新實例,指向kittens集合類的元素。 下面的替代形式在特定情況下有用。
- <pre class="csharp" name="code">List cats = sess.createCriteria(Cat.class)
- .createAlias("kittens", "kt")
- .createAlias("mate", "mt")
- .add(Expression.eqProperty("kt.name", "mt.name"))
- .list();</pre>
- (createAlias())並不會創建一個Criteria的新實例。) 請注意,前面兩個查詢中Cat實例所持有的kittens集合類並沒有通過criteria預先過濾
!如果你希望只返回滿足條件的kittens,你必須使用returnMaps()。
- List cats = sess.createCriteria(Cat.class)
- .createCriteria("kittens", "kt")
- .add( Expression.eq("name", "F%") )
- .returnMaps()
- .list();
- Iterator iter = cats.iterator();
- while ( iter.hasNext())
- {
- Map map = (Map) iter.next();
- Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
- Cat kitten = (Cat) map.get("kt");
- }
- 5、動態關聯對象獲取(Dynamic association fetching) 可以在運行時通過setFetchMode()來改變關聯對象自動獲取的策略。
- <pre class="java" name="code">List cats = sess.createCriteria(Cat.class)
- .add( Expression.like("name", "Fritz%") )
- .setFetchMode("mate", FetchMode.EAGER)
- .list(); </pre>
- 這個查詢會通過外連接(outer join)同時獲得 mate和kittens。
- 6、根據示例查詢(Example queries) net.sf.hibernate.expression.Example類許你從指定的實例創造查詢條件。
- <pre class="java" name="code">Cat cat = new Cat();
- cat.setSex('F');
- cat.setColor(Color.BLACK);
- List results = session.createCriteria(Cat.class)
- .add( Example.create(cat) )
- .list();
- 版本屬性,表示符屬性和關聯都會被忽略。默認情況下,null值的屬性也被排除在外。 You can adjust how the Example is applied. 你可</pre>
以調整示例(Example)如何應用。 Example example = Example.create(cat) .excludeZeroes() //exclude zero valued properties
.excludeProperty("color") //exclude the property named "color" .ignoreCase() //perform case insensitive string comparisons
.enableLike(); //use like for string comparisons
- List results = session.createCriteria(Cat.class)
- .add(example)
- .list();
- 你甚至可以用示例對關聯對象建立criteria。
List results = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
