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();
|