- 具有一个直观的、可扩展的条件查询API是Hibernate的特色。
- 15.1 . 创建一个Criteria 实例
- org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。
- Criteria crit = sess.createCriteria(Cat. class );
- crit.setMaxResults( 50 );
- List cats = crit.list();
- 15.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();
- 15.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();
- 15.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" );
- }
- 15.5 . 动态关联抓取
- 你可以使用setFetchMode()在运行时定义动态关联抓取的语义。
- List cats = sess.createCriteria(Cat. class )
- .add( Restrictions.like( "name" , "Fritz%" ) )
- .setFetchMode( "mate" , FetchMode.EAGER)
- .setFetchMode( "kittens" , FetchMode.EAGER)
- .list();
- 这个查询可以通过外连接抓取mate和kittens。 查看第 19.1 节 “ 抓取策略(Fetching strategies) ”可以获得更多信息。
- 15.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();
- 15.7 . 投影(Projections)、聚合(aggregation)和分组(grouping)
- org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。
- List results = session.createCriteria(Cat. class )
- .setProjection( Projections.rowCount() )
- .add( Restrictions.eq( "color" , Color.BLACK) )
- .list();
- List results = session.createCriteria(Cat. class )
- .setProjection( Projections.projectionList()
- .add( Projections.rowCount() )
- .add( Projections.avg( "weight" ) )
- .add( Projections.max( "weight" ) )
- .add( Projections.groupProperty( "color" ) )
- )
- .list();
- 在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。
- 你可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式:
- List results = session.createCriteria(Cat. class )
- .setProjection( Projections.alias( Projections.groupProperty( "color" ), "colr" ) )
- .addOrder( Order.asc( "colr" ) )
- .list();
- List results = session.createCriteria(Cat. class )
- .setProjection( Projections.groupProperty( "color" ).as( "colr" ) )
- .addOrder( Order.asc( "colr" ) )
- .list();
- alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:
- List results = session.createCriteria(Cat. class )
- .setProjection( Projections.projectionList()
- .add( Projections.rowCount(), "catCountByColor" )
- .add( Projections.avg( "weight" ), "avgWeight" )
- .add( Projections.max( "weight" ), "maxWeight" )
- .add( Projections.groupProperty( "color" ), "color" )
- )
- .addOrder( Order.desc( "catCountByColor" ) )
- .addOrder( Order.desc( "avgWeight" ) )
- .list();
- List results = session.createCriteria(Domestic. class , "cat" )
- .createAlias( "kittens" , "kit" )
- .setProjection( Projections.projectionList()
- .add( Projections.property( "cat.name" ), "catName" )
- .add( Projections.property( "kit.name" ), "kitName" )
- )
- .addOrder( Order.asc( "catName" ) )
- .addOrder( Order.asc( "kitName" ) )
- .list();
- 你也可以使用Property.forName()来表示投影.......
- 更多请参阅http://www.360watcher.net/html/35/655.htm
Hibernate---Criteria
最新推荐文章于 2020-02-11 18:11:50 发布