Hibernate条件查询(Criteria Query)

1、创建一个Criteria实例
net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询。Session是用来制造Criteria实例的工厂。

Criteriacrit=sess.createCriteria(Cat.class);
crit.setMaxResults(50);
Listcats=crit.list();


2、缩小结果集范围
一个查询条件(Criterion)是net.sf.hibernate.expression.Criterion接口的一个实例。类net.sf.hibernate.expression.Expression定义了获得一些内置的Criterion类型。

Listcats=sess.createCriteria(Cat.class)
.add(Expression.like("name","Fritz%"))
.add(Expression.between("weight",minWeight,maxWeight))
.list();
表达式(Expressions)可以按照逻辑分组.

Listcats=sess.createCriteria(Cat.class)
.add(Expression.like("name","Fritz%"))
.add(Expression.or(
Expression.eq("age",newInteger(0)),
Expression.isNull("age")
))
.list();
Listcats=sess.createCriteria(Cat.class)
.add(Expression.in("name",newString[]{"Fritz","Izi","Pk"}))
.add(Expression.disjunction()
.add(Expression.isNull("age"))
.add(Expression.eq("age",newInteger(0)))
.add(Expression.eq("age",newInteger(1)))
.add(Expression.eq("age",newInteger(2)))
))
.list();
有很多预制的条件类型(Expression的子类)。有一个特别有用,可以让你直接嵌入SQL。

Listcats=sess.createCriteria(Cat.class)
.add(Expression.sql("lower($alias.name)likelower(?)","Fritz%",Hibernate.STRING))
.list();
其中的{alias}是一个占位符,它将会被所查询实体的行别名所替代。(原文:The{alias}placeholderwithbereplacedbytherowaliasofthequeriedentity.)

3、对结果排序
可以使用net.sf.hibernate.expression.Order对结果集排序.

Listcats=sess.createCriteria(Cat.class)
.add(Expression.like("name","F%")
.addOrder(Order.asc("name"))
.addOrder(Order.desc("age"))
.setMaxResults(50)
.list();
4、关联(Associations)
你可以在关联之间使用createCriteria(),很容易地在存在关系的实体之间指定约束。

Listcats=sess.createCriteria(Cat.class)
.add(Expression.like("name","F%")
.createCriteria("kittens")
.add(Expression.like("name","F%")
.list();
注意,第二个createCriteria()返回一个Criteria的新实例,指向kittens集合类的元素。

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

Listcats=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()。

Listcats=sess.createCriteria(Cat.class)
.createCriteria("kittens","kt")
.add(Expression.eq("name","F%"))
.returnMaps()
.list();
Iteratoriter=cats.iterator();
while(iter.hasNext()){
Mapmap=(Map)iter.next();
Catcat=(Cat)map.get(Criteria.ROOT_ALIAS);
Catkitten=(Cat)map.get("kt");
}
5、动态关联对象获取(Dynamicassociationfetching)
可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。

Listcats=sess.createCriteria(Cat.class)
.add(Expression.like("name","Fritz%"))
.setFetchMode("mate",FetchMode.EAGER)
.list();
这个查询会通过外连接(outerjoin)同时获得mate和kittens。

6、根据示例查询(Examplequeries)
net.sf.hibernate.expression.Example类允许你从指定的实例创造查询条件。

Catcat=newCat();
cat.setSex('F');
cat.setColor(Color.BLACK);
Listresults=session.createCriteria(Cat.class)
.add(Example.create(cat))
.list();
版本属性,表示符属性和关联都会被忽略。默认情况下,null值的属性也被排除在外。

YoucanadjusthowtheExampleisapplied.你可以调整示例(Example)如何应用。

Exampleexample=Example.create(cat)
.excludeZeroes()//excludezerovaluedproperties
.excludeProperty("color")//excludethepropertynamed"color"
.ignoreCase()//performcaseinsensitivestringcomparisons
.enableLike();//uselikeforstringcomparisons
Listresults=session.createCriteria(Cat.class)
.add(example)
.list();
你甚至可以用示例对关联对象建立criteria。

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

你可能感兴趣的:(sql,Hibernate,.net,F#,嵌入式)