Hibernate criterion 方法总结
设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。现在对 ??? .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();
??? .list();
3. 结果集排序
你可以使用org.
们也出现在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()来表示投影:
List results = session.createCriteria(Cat.class)
??? .setProjection( Property.forName("name") )
??? .add( Property.forName("color").eq(Color.BLACK) )
??? .list();
List results = session.createCriteria(Cat.class)
??? .setProjection( Projections.projectionList()
??????? .add( Projections.rowCount().as("catCountByColor") )
??????? .add( Property.forName("weight").avg().as("avgWeight") )
??????? .add( Property.forName("weight").max().as("maxWeight") )
??????? .add( Property.forName("color").group().as("color" )
??? )
??? .addOrder( Order.desc("catCountByColor") )
??? .addOrder( Order.desc("avgWeight") )
??? .list();
8. 离线(detached)查询和子查询
DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来
执行它。
DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
??? .add( Property.forName("sex").eq('F') );
//创建一个Session
Session session = .;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();
DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者
Property获得。
DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
??? .setProjection( Property.forName("weight").avg() );
session.createCriteria(Cat.class)
??? .add( Property.forName("weight).gt(avgWeight) )
??? .list();
DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
??? .setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
??? .add( Subqueries.geAll("weight", weights) )
??? .list();
相互关联的子查询也是有可能的:
DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
??? .setProjection( Property.forName("weight").avg() )
??? .add( Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class, "cat")
??? .add( Property.forName("weight).gt(avgWeightForSex) )
??? .list();