Hibernate條件查詢(Criteria Query)


1、創(chuàng)建一個(gè)Criteria實(shí)例
net.sf.hibernate.Criteria這個(gè)接口代表對(duì)一個(gè)特定的持久化類的查詢。Session是用來(lái)制造Criteria實(shí)例的工廠。?

Criteria?crit?=?sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List?cats?=?crit.list();


2、縮小結(jié)果集范圍
一個(gè)查詢條件(Criterion)是net.sf.hibernate.expression.Criterion接口的一個(gè)實(shí)例。類net.sf.hibernate.expression.Expression定義了獲得一些內(nèi)置的Criterion類型。?

List?cats?=?sess.createCriteria(Cat.class)
????.add(?Expression.like("name",?"Fritz%")?)
????.add(?Expression.between("weight",?minWeight,?maxWeight)?)
????.list();
表達(dá)式(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();
有很多預(yù)制的條件類型(Expression的子類)。有一個(gè)特別有用,可以讓你直接嵌入SQL。?

List?cats?=?sess.createCriteria(Cat.class)
????.add(?Expression.sql("lower($alias.name)?like?lower(?)",?"Fritz%",?Hibernate.STRING)?)
????.list();
其中的{alias}是一個(gè)占位符,它將會(huì)被所查詢實(shí)體的行別名所替代。(原文:The?{alias}?placeholder?with?be?replaced?by?the?row?alias?of?the?queried?entity.)?

3、對(duì)結(jié)果排序
可以使用net.sf.hibernate.expression.Order對(duì)結(jié)果集排序.?

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

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

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

List?cats?=? sess.createCriteria(Cat.class)
????.createAlias("kittens",?"kt")
????.createAlias("mate",?"mt")
????.add(?Expression.eqProperty("kt.name",?"mt.name")?)
????.list();
(createAlias())并不會(huì)創(chuàng)建一個(gè)Criteria的新實(shí)例。)?

請(qǐng)注意,前面兩個(gè)查詢中Cat實(shí)例所持有的kittens集合類并沒(méi)有通過(guò)criteria預(yù)先過(guò)濾!如果你希望只返回滿足條件的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、動(dòng)態(tài)關(guān)聯(lián)對(duì)象獲取(Dynamic?association?fetching)
可以在運(yùn)行時(shí)通過(guò)setFetchMode()來(lái)改變關(guān)聯(lián)對(duì)象自動(dòng)獲取的策略。?

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

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

Cat?cat?=?new?Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List?results?=?session.createCriteria(Cat.class)
????.add(?Example.create(cat)?)
????.list();
版本屬性,表示符屬性和關(guān)聯(lián)都會(huì)被忽略。默認(rèn)情況下,null值的屬性也被排除在外。?

You?can?adjust?how?the?Example?is?applied.?你可以調(diào)整示例(Example)如何應(yīng)用。?

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();
你甚至可以用示例對(duì)關(guān)聯(lián)對(duì)象建立criteria。?

List?results?=?session.createCriteria(Cat.class)
????.add(?Example.create(cat)?)
????.createCriteria("mate")
????????.add(?Example.create(?cat.getMate()?)?)
????.list();