好好学习,天天向上!

Hibernate Criteria的方法

Criteria是一种比hql更面向对象的查询方式。Criteria 可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式,Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式)。

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类定义了获得某些内置Criterion类型的工厂方法。

 

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

 

  Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。

 

  List cats = sess.createCriteria(Cat.class)

 

  .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",

 

  Hibernate.STRING) )

 

  .list();

 

  {alias}占位符应当被替换为被查询实体的列别名。

 

  Property实例是获得一个条件的另外一种途径。你可以通过调用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()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。

 

  接下来,替换形态在某些情况下也是很有用的。

 

  List cats = sess.createCriteria(Cat.class)

 

  .createAlias("kittens", "kt")

 

  .createAlias("mate", "mt")

 

  .add( Restrictions.eqProperty("kt. name", "mt. name") )

 

  .list();

 

  (createAlias()并不创建一个新的 Criteria实例。)

 

  Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得

 

  符合条件的kittens, 你必须使用returnMaps()。

 

  List cats = sess.createCriteria(Cat.class)

 

  .createCriteria("kittens", "kt")

 

  .add( Restrictions.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. 动态关联抓取

  你可以使用setFetchMode()在运行时定义动态关联抓取的语义。

 

  List cats = sess.createCriteria(Cat.class)

 

  .add( Restrictions.like("name", "Fritz%") )

 

  .setFetchMode("mate", FetchMode.EAGER)

 

  .setFetchMode("kittens", FetchMode.EAGER)

 

  .list();

 

  这个查询可以通过外连接抓取mate和kittens。

6. 查询示例

  org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。

 

  Cat cat = new Cat();

 

  cat.setSex('F');

 

  cat.setColor(Color.BLACK);

 

  List results = session.createCriteria(Cat.class)

 

  .add( Example.create(cat) )

 

  .list();

 

  版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。

 

  可以自行调整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();

 

  甚至可以使用examples在关联对象上放置条件。

 

  List results = session.createCriteria(Cat.class)

 

  .add( Example.create(cat) )

 

  .createCriteria("mate")

 

  .add( Example.create( cat.getMate() ) )

 

  .list();

posted @ 2013-01-10 13:56  忍性而为  阅读(274)  评论(0编辑  收藏  举报
好好学习,天天向上!