Hibernate的Criteria方法

来源:互联网 发布:蓝桥杯单片机 编辑:程序博客网 时间:2024/06/05 11:32
原文地址: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 stringcomparisons

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

原创粉丝点击