Hibernate條件查詢(Criteria Query)


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對結果集排序.?

List?cats?=?sess.createCriteria(Cat.class)
????.add(?Expression.like("name",?"F%")
????.addOrder(?Order.asc("name")?)
????.addOrder(?Order.desc("age")?)
????.setMaxResults(50)
????.list();
4、關聯(Associations)
你可以在關聯之間使用createCriteria(),很容易地在存在關系的實體之間指定約束。?

List?cats?=?sess.createCriteria(Cat.class)
????.add(?Expression.like("name",?"F%")
????.createCriteria("kittens")
????????.add(?Expression.like("name",?"F%")
????.list();
注意,第二個createCriteria()返回一個Criteria的新實例,指向kittens集合類的元素。?

下面的替代形式在特定情況下有用。?

List?cats?=? sess.createCriteria(Cat.class)
????.createAlias("kittens",?"kt")
????.createAlias("mate",?"mt")
????.add(?Expression.eqProperty("kt.name",?"mt.name")?)
????.list();
(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()來改變關聯對象自動獲取的策略。?

List?cats?=?sess.createCriteria(Cat.class)
????.add(?Expression.like("name",?"Fritz%")?)
????.setFetchMode("mate",?FetchMode.EAGER)
????.list();
這個查詢會通過外連接(outer?join)同時獲得?mate和kittens。?

6、根據示例查詢(Example?queries)
net.sf.hibernate.expression.Example類允許你從指定的實例創造查詢條件。?

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.?你可以調整示例(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();