15.2. 限制结果集内容

一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。

  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Restrictions.like("name", "Fritz%") )
  3. .add( Restrictions.between("weight", minWeight, maxWeight) )
  4. .list();

约束可以按逻辑分组。

  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Restrictions.like("name", "Fritz%") )
  3. .add( Restrictions.or(
  4. Restrictions.eq( "age", new Integer(0) ),
  5. Restrictions.isNull("age")
  6. ) )
  7. .list();
  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
  3. .add( Restrictions.disjunction()
  4. .add( Restrictions.isNull("age") )
  5. .add( Restrictions.eq("age", new Integer(0) ) )
  6. .add( Restrictions.eq("age", new Integer(1) ) )
  7. .add( Restrictions.eq("age", new Integer(2) ) )
  8. ) )
  9. .list();

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

  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Restrictions.sqlRestriction("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) )
  3. .list();

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

Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property

  1. Property age = Property.forName("age");
  2. List cats = sess.createCriteria(Cat.class)
  3. .add( Restrictions.disjunction()
  4. .add( age.isNull() )
  5. .add( age.eq( new Integer(0) ) )
  6. .add( age.eq( new Integer(1) ) )
  7. .add( age.eq( new Integer(2) ) )
  8. ) )
  9. .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
  10. .list();