• Hibernate Criteria 查询使用


    转载 http://blog.csdn.net/woshisap/article/details/6747466 

    Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。
       Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需 Session,DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 实例的创建
        Spring 的框架提供了getHibernateTemplate ().findByCrite(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结果。 
        Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件。可以设 置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式。对于 Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式)。
        Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来 添加查询条件。      Criterion 接口的主要实现包括: Example 、 Junction 和 SimpleExpression 。而 Junction 的实际使用是它的两个子类 conjunction 和 disjunction ,分别是使用 AND 和 OR 操作符进行来联结查询条件集合。      Criterion 的实例可以通过 Restrictions 工具类来创建,Restrictions 提供了大量的静态 方法,如 eq (等于)、 ge (大于等于)、 between 等来方法的创建 Criterion 查询条件 (SimpleExpression 实例)。除此之外, Restrictions 还提供了方法来创建 conjunction 和 disjunction 实例,通过往该实例的 add(Criteria) 方法来增加查询条件形成一个查询条件集合 。至于 Example 的创建有所不同, Example 本身提供了一个静态方法 create(Object entity) ,即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些 过滤条件: 
       Example exampleUser =Example.create(u) .ignoreCase() // 忽略大小写

    .enableLike(MatchMode.ANYWHERE); // 对 String 类型的属性,无论在那里值在那里都匹配。相当于 %value%  

    Project 主要是让 Criteria 能够进行报表查询,并可以实现分组。 Project 主要有 SimpleProjection 、 ProjectionList 和 Property 三个实现。其中 SimpleProjection 和 ProjectionList 的实例化是由内建的 Projections 来完成,如提供的 avg 、 count 、 max 、 min 、 sum 可以让开发者很容易对某个字段进行统计查询。       

    Property 是对某个字段进行查询条件的设置,如通过Porperty.forName(“color”).in (new String[]{“black”,”red”,”write”}); 则可以创建一个 Project 实例。通过 criteria 的 add(Project) 方法加入到查询条件中去。     使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查 询条件的创建和组装,下面介绍几种用法:
        1. 创建一个Criteria 实例 org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。
      

    [java] view plaincopy
     
    1. Java代码   
    2. 1.   Criteria crit = sess.createCriteria(Cat.class);     
    3. 2.   
    4. 3.crit.setMaxResults(50);     
    5. 4.   
    6. 5.List cats = crit.list();      
    7. 6.   
    8. 7.      
    9.    Criteria crit = sess.createCriteria(Cat.class);  
    10.   
    11. crit.setMaxResults(50);  
    12.   
    13. List cats = crit.list();    

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

    [java] view plaincopy
     
    1. Java代码   
    2. 1.List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") )     
    3. 2.   
    4. 3..add( Restrictions.between("weight", minWeight, maxWeight) ) .list();    
    5. List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") )  
    6.   
    7. .add( Restrictions.between("weight", minWeight, maxWeight) ) .list();   


    约束可以按逻辑分组。

    [java] view plaincopy
     
    1. Java代码   
    2. 1.List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") )    
    3. 2.   
    4. 3..add( Restrictions.or( Restrictions.eq( "age", new Integer(0) ), Restrictions.isNull("age")     ) ) .list();       
    5. 4.   
    6. 5.List cats = sess.createCriteria(Cat.class)    
    7. 6.   
    8. 7..add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )     
    9. 8.   
    10. 9..add( Restrictions.disjunction() .add( Restrictions.isNull("age") )     
    11. 10.   
    12. 11..add( Restrictions.eq("age", new Integer(0) ) )     
    13. 12.   
    14. 13..add( Restrictions.eq("age", new Integer(1) ) )             
    15. 14.   
    16. 15..add( Restrictions.eq("age", new Integer(2) ) ) ) )         
    17. 16.   
    18. 17..list();      
    19. List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") )  
    20.   
    21. .add( Restrictions.or( Restrictions.eq( "age", new Integer(0) ), Restrictions.isNull("age") ) ) .list();    
    22.   
    23. List cats = sess.createCriteria(Cat.class)  
    24.   
    25. .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )  
    26.   
    27. .add( Restrictions.disjunction() .add( Restrictions.isNull("age") )  
    28.   
    29. .add( Restrictions.eq("age", new Integer(0)))  
    30.   
    31. .add( Restrictions.eq("age", new Integer(1)))          
    32.   
    33. .add( Restrictions.eq("age", new Integer(2)))))      
    34.   
    35. .list();     


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


    Java代码 

    [java] view plaincopy
     
    1. 1.List cats = sess.createCriteria(Cat.class)     
    2. 2.   
    3. 3..add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) )  .list();      
    4. List cats = sess.createCriteria(Cat.class)  
    5.   
    6. .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) )  .list();    



    {alias}占位符应当被替换为被查询实体的列别名。 Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个 Property。   

    [java] view plaincopy
     
    1. Java代码   
    2. 1. Property age = Property.forName("age");     
    3. 2.   
    4. 3.List cats = sess.createCriteria(Cat.class)         
    5. 4.   
    6. 5..add( Restrictions.disjunction()             
    7. 6.   
    8. 7..add( age.isNull() )             
    9. 8.   
    10. 9..add( age.eq( new Integer(0) ) )             
    11. 10.   
    12. 11..add( age.eq( new Integer(1) ) )             
    13. 12.   
    14. 13..add( age.eq( new Integer(2) ) )     ) )         
    15. 14.   
    16. 15..add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )         
    17. 16.   
    18. 17..list();      
    19.  Property age = Property.forName("age");  
    20.   
    21. List cats = sess.createCriteria(Cat.class)      
    22.   
    23. .add( Restrictions.disjunction()          
    24.   
    25. .add( age.isNull() )          
    26.   
    27. .add( age.eq( new Integer(0) ) )          
    28.   
    29. .add( age.eq( new Integer(1) ) )          
    30.   
    31. .add( age.eq( new Integer(2) ) )     ) )      
    32.   
    33. .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )      
    34.   
    35. .list();     

    3. 结果集排序你可以使用org.hibernate.criterion.Order来为查询结果排序。 

    Java代码  

    [java] view plaincopy
     
    1. 1.List cats = sess.createCriteria(Cat.class)         
    2. 2.   
    3. 3..add( Restrictions.like("name", "F%")         
    4. 4.   
    5. 5..addOrder( Order.asc("name") )         
    6. 6.   
    7. 7..addOrder( Order.desc("age") )         
    8. 8.   
    9. 9..setMaxResults(50)         
    10. 10.   
    11. 11..list();      
    12. 12.   
    13. 13. List cats = sess.createCriteria(Cat.class)         
    14. 14.   
    15. 15..add( Property.forName("name").like("F%") )         
    16. 16.   
    17. 17..addOrder( Property.forName("name").asc() )         
    18. 18.   
    19. 19..addOrder( Property.forName("age").desc() )         
    20. 20.   
    21. 21..setMaxResults(50)         
    22. 22.   
    23. 23..list();       
    24. 24. 4. 关联你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。       
    25. 25.   
    26. 26.List cats = sess.createCriteria(Cat.class)         
    27. 27.   
    28. 28..add( Restrictions.like("name", "F%")         
    29. 29.   
    30. 30..createCriteria("kittens")             
    31. 31.   
    32. 32..add( Restrictions.like("name", "F%")         
    33. 33.   
    34. 34..list();      

    35.  
    36.注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。 接下来,替换形态在某些情况下也是很有用的。     
    37.  

    [java] view plaincopy
     
    1. 38.List cats = sess.createCriteria(Cat.class)        
    2. 39.   
    3. 40. .createAlias("kittens", "kt")         
    4. 41.   
    5. 42..createAlias("mate", "mt")         
    6. 43.   
    7. 44..add( Restrictions.eqProperty("kt.name", "mt.name") )         
    8. 45.   
    9. 46..list();    
    10. 47.    

    48. (createAlias()并不创建一个新的 Criteria实例。) Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得 符合条件的kittens, 你必须使用returnMaps()。     

    [java] view plaincopy
     
    1. 49.   
    2. 50.List cats = sess.createCriteria(Cat.class)         
    3. 51.   
    4. 52..createCriteria("kittens", "kt")         
    5. 53.   
    6. 54..add( Restrictions.eq("name", "F%") )         
    7. 55.   
    8. 56..returnMaps()         
    9. 57.   
    10. 58..list();     
    11. 59.   
    12. 60.Iterator iter = cats.iterator(); while ( iter.hasNext() ) {    
    13. 61.   
    14. 62.     Map map = (Map) iter.next();     
    15. 63.   
    16. 64.    Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);    
    17. 65.   
    18. 66.     Cat kitten = (Cat) map.get("kt");     
    19. 67.   
    20. 68.}    
    21. List cats = sess.createCriteria(Cat.class)      
    22.   
    23. .add( Restrictions.like("name", "F%")      
    24.   
    25. .addOrder( Order.asc("name") )      
    26.   
    27. .addOrder( Order.desc("age") )      
    28.   
    29. .setMaxResults(50)      
    30.   
    31. .list();   
    32.   
    33.  List cats = sess.createCriteria(Cat.class)      
    34.   
    35. .add( Property.forName("name").like("F%") )      
    36.   
    37. .addOrder( Property.forName("name").asc() )      
    38.   
    39. .addOrder( Property.forName("age").desc() )      
    40.   
    41. .setMaxResults(50)      
    42.   
    43. .list();    
    44.  4. 关联你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。    
    45.   
    46. List cats = sess.createCriteria(Cat.class)      
    47.   
    48. .add( Restrictions.like("name", "F%")      
    49.   
    50. .createCriteria("kittens")          
    51.   
    52. .add( Restrictions.like("name", "F%")      
    53.   
    54. .list();   

    注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。 接下来,替换形态在某些情况下也是很有用的。  

    [java] view plaincopy
     
    1. List cats = sess.createCriteria(Cat.class)     
    2.   
    3.  .createAlias("kittens", "kt")      
    4.   
    5. .createAlias("mate", "mt")      
    6.   
    7. .add( Restrictions.eqProperty("kt.name", "mt.name") )      
    8.   
    9. .list();  
    10.   
    11.  (createAlias()并不创建一个新的 Criteria实例。) Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得 符合条件的kittens, 你必须使用returnMaps()。    
    12.   
    13. List cats = sess.createCriteria(Cat.class)      
    14.   
    15. .createCriteria("kittens", "kt")      
    16.   
    17. .add( Restrictions.eq("name", "F%") )      
    18.   
    19. .returnMaps()      
    20.   
    21. .list();  
    22.   
    23. Iterator iter = cats.iterator(); while ( iter.hasNext() ) {  
    24.   
    25.      Map map = (Map) iter.next();  
    26.   
    27.     Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);  
    28.   
    29.      Cat kitten = (Cat) map.get("kt");  
    30.   
    31. }  
    32.   
    33.    

    5. 动态关联抓取你可以使用setFetchMode()在运行时定义动态关联抓取的语义。  

    Java代码 

    [java] view plaincopy
     
    1. 1.List cats = sess.createCriteria(Cat.class)         
    2. 2.   
    3. 3..add( Restrictions.like("name", "Fritz%") )         
    4. 4.   
    5. 5..setFetchMode("mate", FetchMode.EAGER)         
    6. 6.   
    7. 7..setFetchMode("kittens", FetchMode.EAGER)         
    8. 8.   
    9. 9..list();     
    10. List cats = sess.createCriteria(Cat.class)      
    11.   
    12. .add( Restrictions.like("name", "Fritz%") )      
    13.   
    14. .setFetchMode("mate", FetchMode.EAGER)      
    15.   
    16. .setFetchMode("kittens", FetchMode.EAGER)      
    17.   
    18. .list();    


    这个查询可以通过外连接抓取mate和kittens。  

    6. 查询示例 org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。 

    Java代码 

    [java] view plaincopy
     
    1. 1.Cat cat = new Cat();     
    2. 2.   
    3. 3.cat.setSex('F');     
    4. 4.   
    5. 5.cat.setColor(Color.BLACK);     
    6. 6.   
    7. 7.List results = session.createCriteria(Cat.class)         
    8. 8.   
    9. 9..add( Example.create(cat) )         
    10. 10.   
    11. 11..list();    
    12. Cat cat = new Cat();  
    13.   
    14. cat.setSex('F');  
    15.   
    16. cat.setColor(Color.BLACK);  
    17.   
    18. List results = session.createCriteria(Cat.class)      
    19.   
    20. .add( Example.create(cat) )      
    21.   
    22. .list();   

    版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。 可以自行调整Example使之更实用。 

    甚至可以使用examples在关联对象上放置条件。  

    Java代码 

    [java] view plaincopy
     
    1. 1.Example example = Example.create(cat)         
    2. 2.   
    3. 3..excludeZeroes()           //exclude zero valued properties         
    4. 4.   
    5. 5..excludeProperty("color")  //exclude the property named "color"         
    6. 6.   
    7. 7..ignoreCase()              //perform case insensitive string comparisons         
    8. 8.   
    9. 9..enableLike();             //use like for string comparisons     
    10. 10.   
    11. 11.List results = session.createCriteria(Cat.class)         
    12. 12.   
    13. 13..add(example)         
    14. 14.   
    15. 15..list();     
    16. 16.   
    17. 17.List results = session.createCriteria(Cat.class)         
    18. 18.   
    19. 19..add( Example.create(cat) )     .createCriteria("mate")             
    20. 20.   
    21. 21..add( Example.create( cat.getMate() ) )        
    22. 22.   
    23. 23. .list();    
    24. Example example = Example.create(cat)      
    25.   
    26. .excludeZeroes()           //exclude zero valued properties      
    27.   
    28. .excludeProperty("color")  //exclude the property named "color"      
    29.   
    30. .ignoreCase()              //perform case insensitive string comparisons      
    31.   
    32. .enableLike();             //use like for string comparisons  
    33.   
    34. List results = session.createCriteria(Cat.class)      
    35.   
    36. .add(example)      
    37.   
    38. .list();  
    39.   
    40. List results = session.createCriteria(Cat.class)      
    41.   
    42. .add( Example.create(cat) )     .createCriteria("mate")          
    43.   
    44. .add( Example.create( cat.getMate() ) )     
    45.   
    46.  .list();   


    7. 投影(Projections)、聚合(aggregation)和分组(grouping) org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。  

    Java代码  

    [java] view plaincopy
     
    1. 1.List results = session.createCriteria(Cat.class)         
    2. 2.   
    3. 3..setProjection( Projections.rowCount() )        
    4. 4.   
    5. 5..add( Restrictions.eq("color", Color.BLACK) )         
    6. 6.   
    7. 7..list();       
    8. 8.   
    9. 9.List results = session.createCriteria(Cat.class)         
    10. 10.   
    11. 11..setProjection( Projections.projectionList()             
    12. 12.   
    13. 13..add( Projections.rowCount() )             
    14. 14.   
    15. 15..add( Projections.avg("weight") )             
    16. 16.   
    17. 17..add( Projections.max("weight") )             
    18. 18.   
    19. 19..add( Projections.groupProperty("color") )     )        
    20. 20.   
    21. 21..list();      
    22. 22.    


    23.在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他 们也出现在SQL的group by子句中。 可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的 实现方式:   List results = session.createCriteria(Cat.class)       

    [java] view plaincopy
     
    1. 24.   
    2. 25..setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )     .addOrder( Order.asc("colr") )         
    3. 26.   
    4. 27..list();    
    5. 28.   
    6. 29.      
    7. 30.   
    8. 31.List results = session.createCriteria(Cat.class)         
    9. 32.   
    10. 33..setProjection( Projections.groupProperty("color").as("colr") )         
    11. 34.   
    12. 35..addOrder( Order.asc("colr") )         
    13. 36.   
    14. 37..list();       
    15. 38.    


    39.alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之, 当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:   

    [java] view plaincopy
     
    1. List  results = session.createCriteria(Cat.class)         
    2. 40.   
    3. 41..setProjection( Projections.projectionList()             
    4. 42.   
    5. 43..add( Projections.rowCount(), "catCountByColor" )             
    6. 44.   
    7. 45..add( Projections.avg("weight"), "avgWeight" )             
    8. 46.   
    9. 47..add( Projections.max("weight"), "maxWeight" )             
    10. 48.   
    11. 49..add( Projections.groupProperty("color"), "color" )     )         
    12. 50.   
    13. 51..addOrder( Order.desc("catCountByColor") )         
    14. 52.   
    15. 53..addOrder( Order.desc("avgWeight") )         
    16. 54.   
    17. 55..list();    
    18. 56.   
    19. 57. List results = session.createCriteria(Domestic.class, "cat")         
    20. 58.   
    21. 59..createAlias("kittens", "kit")         
    22. 60.   
    23. 61..setProjection( Projections.projectionList()             
    24. 62.   
    25. 63..add( Projections.property("cat.name"), "catName" )             
    26. 64.   
    27. 65..add( Projections.property("kit.name"), "kitName" )     )         
    28. 66.   
    29. 67..addOrder( Order.asc("catName") )         
    30. 68.   
    31. 69..addOrder( Order.asc("kitName") )         
    32. 70.   
    33. 71..list();     
    34. 72.   
    35. 73.也可以使用Property.forName()来表示投影:       
    36. 74.   
    37. 75.List results = session.createCriteria(Cat.class)         
    38. 76.   
    39. 77..setProjection( Property.forName("name") )         
    40. 78.   
    41. 79..add( Property.forName("color").eq(Color.BLACK) )         
    42. 80.   
    43. 81..list();    
    44. 82.   
    45. 83. List results = session.createCriteria(Cat.class)         
    46. 84.   
    47. 85..setProjection( Projections.projectionList()             
    48. 86.   
    49. 87..add( Projections.rowCount().as("catCountByColor") )            
    50. 88.   
    51. 89..add( Property.forName("weight").avg().as("avgWeight") )            
    52. 90.   
    53. 91..add( Property.forName("weight").max().as("maxWeight") )            
    54. 92.   
    55. 93..add( Property.forName("color").group().as("color" )     )         
    56. 94.   
    57. 95..addOrder( Order.desc("catCountByColor") )         
    58. 96.   
    59. 97..addOrder( Order.desc("avgWeight") )        
    60. 98.   
    61. 99..list();   
    62. List results = session.createCriteria(Cat.class)      
    63.   
    64. .setProjection( Projections.rowCount() )     
    65.   
    66. .add( Restrictions.eq("color", Color.BLACK) )      
    67.   
    68. .list();    
    69.   
    70. List results = session.createCriteria(Cat.class)      
    71.   
    72. .setProjection( Projections.projectionList()          
    73.   
    74. .add( Projections.rowCount() )          
    75.   
    76. .add( Projections.avg("weight") )          
    77.   
    78. .add( Projections.max("weight") )          
    79.   
    80. .add( Projections.groupProperty("color") )     )     
    81.   
    82. .list();  
    83.   
    84. 在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他 们也出现在SQL的group by子句中。 可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的 实现方式:   List results = session.createCriteria(Cat.class)      
    85.   
    86. .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )     .addOrder( Order.asc("colr") )      
    87.   
    88. .list();  
    89.   
    90. List results = session.createCriteria(Cat.class)      
    91.   
    92. .setProjection( Projections.groupProperty("color").as("colr") )      
    93.   
    94. .addOrder( Order.asc("colr") )      
    95.   
    96. .list();     



    alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之, 当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:  

    [java] view plaincopy
     
    1. List results = session.createCriteria(Cat.class)      
    2.   
    3. .setProjection( Projections.projectionList()          
    4.   
    5. .add( Projections.rowCount(), "catCountByColor" )          
    6.   
    7. .add( Projections.avg("weight"), "avgWeight" )          
    8.   
    9. .add( Projections.max("weight"), "maxWeight" )          
    10.   
    11. .add( Projections.groupProperty("color"), "color" )     )      
    12.   
    13. .addOrder( Order.desc("catCountByColor") )      
    14.   
    15. .addOrder( Order.desc("avgWeight") )      
    16.   
    17. .list();  
    18.   
    19.  List results = session.createCriteria(Domestic.class, "cat")      
    20.   
    21. .createAlias("kittens", "kit")      
    22.   
    23. .setProjection( Projections.projectionList()          
    24.   
    25. .add( Projections.property("cat.name"), "catName" )          
    26.   
    27. .add( Projections.property("kit.name"), "kitName" )     )      
    28.   
    29. .addOrder( Order.asc("catName") )      
    30.   
    31. .addOrder( Order.asc("kitName") )      
    32.   
    33. .list();  
    34.   
    35. 也可以使用Property.forName()来表示投影:    
    36.   
    37. List results = session.createCriteria(Cat.class)      
    38.   
    39. .setProjection( Property.forName("name") )      
    40.   
    41. .add( Property.forName("color").eq(Color.BLACK) )      
    42.   
    43. .list();  
    44.   
    45.  List results = session.createCriteria(Cat.class)      
    46.   
    47. .setProjection( Projections.projectionList()          
    48.   
    49. .add( Projections.rowCount().as("catCountByColor") )         
    50.   
    51. .add( Property.forName("weight").avg().as("avgWeight") )         
    52.   
    53. .add( Property.forName("weight").max().as("maxWeight") )         
    54.   
    55. .add( Property.forName("color").group().as("color" )     )      
    56.   
    57. .addOrder( Order.desc("catCountByColor") )      
    58.   
    59. .addOrder( Order.desc("avgWeight") )     
    60.   
    61. .list();  


    8. 离线(detached)查询和子查询 DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来 执行它。  

    Java代码 

    [java] view plaincopy
     
    1. 1.DetachedCriteria query = DetachedCriteria.forClass(Cat.class)         
    2. 2.   
    3. 3..add( Property.forName("sex").eq('F') );     
    4. 4.   
    5. 5.//创建一个Session     
    6. 6.   
    7. 7.Session session = .;     
    8. 8.   
    9. 9.Transaction txn = session.beginTransaction();     
    10. 10.   
    11. 11.List results = query.getExecutableCriteria(session).setMaxResults(100).list();     
    12. 12.   
    13. 13.txn.commit();     
    14. 14.   
    15. 15.session.close();     
    16. 16.   
    17. 17.DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者 Property获得。       
    18. 18.   
    19. 19.DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)         
    20. 20.   
    21. 21..setProjection( Property.forName("weight").avg() );     
    22. 22.   
    23. 23.session.createCriteria(Cat.class)         
    24. 24.   
    25. 25..add( Property.forName("weight).gt(avgWeight) )         
    26. 26.   
    27. 27.    .list();    
    28. 28.   
    29. 29. DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)         
    30. 30.   
    31. 31.    .setProjection( Property.forName("weight") );     
    32. 32.   
    33. 33.session.createCriteria(Cat.class)         
    34. 34.   
    35. 35.    .add( Subqueries.geAll("weight", weights) )        
    36. 36.   
    37. 37.    .list();    
    38. DetachedCriteria query = DetachedCriteria.forClass(Cat.class)      
    39.   
    40. .add( Property.forName("sex").eq('F') );  
    41.   
    42. //创建一个Session  
    43.   
    44. Session session = .;  
    45.   
    46. Transaction txn = session.beginTransaction();  
    47.   
    48. List results = query.getExecutableCriteria(session).setMaxResults(100).list();  
    49.   
    50. txn.commit();  
    51.   
    52. session.close();  
    53.   
    54. DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者 Property获得。    
    55.   
    56. DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)      
    57.   
    58. .setProjection( Property.forName("weight").avg() );  
    59.   
    60. session.createCriteria(Cat.class)      
    61.   
    62. .add( Property.forName("weight).gt(avgWeight) )      
    63.   
    64.     .list();  
    65.   
    66.  DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)      
    67.   
    68.     .setProjection( Property.forName("weight") );  
    69.   
    70. session.createCriteria(Cat.class)      
    71.   
    72.     .add( Subqueries.geAll("weight", weights) )     
    73.   
    74.     .list();   


    HIbernate 查询指定的字段

    Criteria c = session.createCriteria(UserVo.class);

    ProjectList plist = Projections.projectList().add(Projections.Properties("user_id"));

    c.setProjection(plist);

    c.list()...

  • 相关阅读:
    MySQL主键和外键使用及说明
    SQLAlchemy
    路飞学城购买流程API
    路飞学城知识点
    使用rest_framework写api接口的一些注意事项(axios发送ajax请求)
    微信推送功能
    支付宝支付业务
    路飞学城前端Vue
    Python爬虫,用第三方库解决下载网页中文本的问题
    Python爬虫,抓取淘宝商品评论内容
  • 原文地址:https://www.cnblogs.com/Wen-yu-jing/p/4238849.html
Copyright © 2020-2023  润新知