hibernate Criteria 查询

来源:互联网 发布:淘宝网老人羊绒大衣 编辑:程序博客网 时间:2024/05/18 01:56

1 创建一个Criteria实例

org.hibernate.Criteria代表一个对特定持久化类的查询。Session是Criteria的工厂:

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

2 限制结果集

一个单独的查询条件是 org.hibernate.criterion.Criterion接口的一个实例。类 org.hibernate.criterion.Restrictions
声明了工厂方法获得内置的标准类型。
List cats = sess.createCriteria(Cat.class)    .add( Restrictions.like("name", "Fritz%") )    .add( Restrictions.between("weight", minWeight, maxWeight) )    .list();
约束可以按逻辑分组
List cats = sess.createCriteria(Cat.class)    .add( Restrictions.like("name", "Fritz%") )    .add( Restrictions.or(        Restrictions.eq( "age", new Integer(0) ),        Restrictions.isNull("age")    ) )    .list();
List cats = sess.createCriteria(Cat.class)    .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )    .add( Restrictions.disjunction()        .add( Restrictions.isNull("age") )        .add( Restrictions.eq("age", new Integer(0) ) )        .add( Restrictions.eq("age", new Integer(1) ) )        .add( Restrictions.eq("age", new Integer(2) ) )    ) )    .list();
有一系列内置Criterion类型(Restrictions子类),其中最有用的是你可以直接使用SQL语句。
List cats = sess.createCriteria(Cat.class)    .add( Restrictions.sqlRestriction("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) )    .list();
用具体查询实体该行的别名代替占位符{alias}。你也可以从一个Property实例获得criterion,你可以通过调用Property.forName()创建一个Property:
Property age = Property.forName("age");List cats = sess.createCriteria(Cat.class)    .add( Restrictions.disjunction()        .add( age.isNull() )        .add( age.eq( new Integer(0) ) )        .add( age.eq( new Integer(1) ) )        .add( age.eq( new Integer(2) ) )    ) )    .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )    .list();

3 结果集排序

你可以使用org.hibernate.criterion.Order对结果集进行排序。

List cats = sess.createCriteria(Cat.class)    .add( Restrictions.like("name", "F%")    .addOrder( Order.asc("name") )    .addOrder( Order.desc("age") )    .setMaxResults(50)    .list();
List cats = sess.createCriteria(Cat.class)    .add( Property.forName("name").like("F%") )    .addOrder( Property.forName("name").asc() )    .addOrder( Property.forName("age").desc() )    .setMaxResults(50)    .list();

4 关联

通过createCriteria()检索关联关系,你可以通过在相关实体上指定约束:
List cats = sess.createCriteria(Cat.class)    .add( Restrictions.like("name", "F%") )    .createCriteria("kittens")        .add( Restrictions.like("name", "F%") )    .list();
第二个createCriteria()返回一个指向kittens集合的Criteria实例。
还有一个替代形式,在某些情况下特别有用:
List cats = sess.createCriteria(Cat.class)    .createAlias("kittens", "kt")    .createAlias("mate", "mt")    .add( Restrictions.eqProperty("kt.name", "mt.name") )    .list()
createAlias()没有创建一个Criteria实例。
由前面两个查询中Cat实例持有的kittens集合没有预先设置过滤标准。
如果你只想获得符合条件的kitten,你必须使用ResultTransFormer:
List cats = sess.createCriteria(Cat.class)    .createCriteria("kittens", "kt")        .add( Restrictions.eq("name", "F%") )    .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)    .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");}
此外,你可以使用左外连接操作结果集:
List cats = session.createCriteria( Cat.class )                       .createAlias("mate", "mt", Criteria.LEFT_JOIN, Restrictions.like("mt.name", "good%") )                       .addOrder(Order.asc("mt.age"))                       .list();
上面会返回所有有伴侣并且伴侣的名字以good开头,按照伴侣年龄排序的猫以及所有没有伴侣的猫。在返回复杂/大型结果集之前,需要订购或限制在数据库中非常有用。
并且去除很多情况下,通过java许多查询和结果集的联合在内存中被执行。如果没有这个特性,首先所有没有伴侣的猫需要一个查询来加载,第二个查询需要获得伴侣名字以“good”
开头,并按年龄排序的猫。第三,在内存中,该列表需要手动连接。

5 动态关联抓取

你可以在运行时使用setFetchMode()指定关联抓取语义:
List cats = sess.createCriteria(Cat.class)    .add( Restrictions.like("name", "Fritz%") )    .setFetchMode("mate", FetchMode.EAGER)    .setFetchMode("kittens", FetchMode.EAGER)    .list();

这个查询会通过外连接抓取mate和kittens


6 组件

要添加一个限制对一个嵌入式组件的属性。组件属性名应该在创建限制时被附加到属性名。criteriad对象要被拥有它的实体创建,而不是组件本身。举例来说,假设Cat有一个
组件属性fullName包括两firstName和lastName.
List cats = session.createCriteria(Cat.class).add(Restrictions.eq("fullName.lastName", "Cattington")).list();

7 集合

当对集合使用Criteria,有两种不同的情况。一种是集合中包含实体(如:one-to-many or many-to-many)或组件(composite-element),第二种情况是集合中含有
标量。第一种情况即上面提到的关联。从本质上讲,我们创建一个criteria实例对集合的属性或限制实体或组件的属性。
对于查询基本值集合,我们仍然为集合创建criteria,使用特殊的属性“elements”.对于一个索引集合,我们可以使用特殊的属性“indices”引用索引属性
List cats = session.createCriteria(Cat.class).createCriteria("nickNames").add(Restrictions.eq("elements", "BadBoy")).list();




0 0
原创粉丝点击