zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    【单调栈】求一个数组第一个比他小的数的位置
    【双向bfs】2017多校训练十 HDU 6171 Admiral
    【归并排序求逆序对个数】【树状数组求逆序对个数】
    【单调队列优化dp】uestc 594 我要长高
    【单调队列优化dp】HDU 3401 Trade
    【单调队列+尺取】HDU 3530 Subsequence
    linux下备份目录文件及目录
    浅谈 Python 的 with 语句
    SQLAlchemy中scoped_session
    pycharm自定义代码片段
  • 原文地址:https://www.cnblogs.com/a1280055207/p/2854680.html
Copyright © 2011-2022 走看看