2011-09-21 57 views

回答

74

它们并不相互排斥,您可以同时使用两者。预测通常用于某些标准的上下文中。

简而言之,Hibernate Projections用于仅查询您使用Criteria查询的实体或实体组的属性子集。您还可以使用Projections来指定distinct子句和聚合函数,如maxsum等。这就像参考哪个您正在提取的数据。就像修改SQL查询中的select子句一样。

Hibernate Criteria用于定义数据必须满足的条件才能被选中。这就像是指如何是你提取的数据。就像修改SQL查询的fromwhere子句一样。

注意,这如何是并不完全正确,它只是旨在帮助OP的方向。例如,您可以更改其中您要提取的数据,例如createCriteria(String associationPath)

我建议你看看这篇文章Hibernate: Criteria Queries in Depth

+2

它是有用的计数() - >收益率(次数)session.createCriteria( “书”)setProjection(Projections.rowCount())uniqueResult()。; –

1

投影处于“org.hibernate.criterion”包给出的接口,预测是在同一个包中给出的类,其实投影是一个接口, Projections是一个类,是一个生产投​​影对象的工厂。

在Projections类中,我们有所有静态方法,并且此类的每个方法都返回Projection接口对象。

如果我们想添加一个投影对象的标准,然后我们需要调用一个方法setProjection()

记住,同时加入投影对象的标准,就可以一次添加一个对象。这意味着如果我们添加第二个投影对象,那么这第二个将覆盖第一个(第一个不会工作),所以一次只能有一个投影对象到条件对象

使用条件,如果我们想要加载从数据库中部分对象,那么我们就需要创造财产的投影对象,如果再加上多个投影到标准则添加的最后一个投影将被视为执行看到从数据库

Criteria crit = session.createCriteria(Products.class); 
crit.setProjection(Projections.proparty("proName")); 
List l=crit.list(); 
Iterator it=l.iterator(); 
while(it.hasNext()) 
{ 
    String s = (String)it.next(); 
    // ---- print ----- 
} 

加载中...

Criteria crit = session.createCriteria(Products.class); 

Projection p1 = Projection.property("proName"); 
Projection p2 = Projection.property("price"); 

crit.setProjection(p1): 
crit.setProjection(p2): 
List l=crit.list(); 
+1

这是如何回答这个问题的? – 000

+1

链接到原始http://www.java4s.com/hibernate/working-with-hibernate-projections-in-criteria/ –

0

个预测是用于执行聚合操作,并获得一列的查询,但有限制,我们可以访问ROW但有凸起我们可以访问整个COLUMN

EX -

public static void main(String[] args) { 
    SessionFactory factory = new Configuration().configure().addAnnotatedClass(Student.class).buildSessionFactory(); 
    Session session = factory.getCurrentSession(); 
    try { 
     session.beginTransaction(); 
     Criteria c = session.createCriteria(Student.class); 
     Projection p = Projections.property("lastName"); 
     List<String> students = c.setProjection(p).list(); 
     for(String s:students) 
      System.out.println(s); 
     session.getTransaction().commit(); 
     session.close(); 
    } finally { 
     factory.close(); 
    } 
} 

在上面例如我使用投影调用来将投影属性“名称”添加到条件。它返回温彻斯特温彻斯特温彻斯特温彻斯特,这是在表中的姓氏

输出=

休眠:从学生选择this_.last_name作为y0_ THIS_ 温彻斯特温彻斯特 温彻斯特 温彻斯特

注 - 我们可以,如果我们只添加一个投影,添加超过1个投影前一个将被覆盖。如果你想添加多个投影,你会NEDD ProjectionList类

一部开拓创新的表 -

enter image description here