2015-02-17 43 views
0

我有這樣Java的Hibernate的一對多獲取使用標準

public class Student 
{ 
    private School school;//many to one... 
    //setter and getters ommited 
} 

public class School 
{ 
    private Set<Student>students;//Students... 
    private Set<Owner>owners;//Owners one to many.... 
} 

我有我的代碼是很容易的一個實體..

final Criteria criteria = session.createCriteria(Student.class) 
.add(filters) 
.setFetchMode("school",FetchMode.JOIN); 
final List<Student>students = criteria.list(); 

但我想取回業主以及後來我可以做

for(final Student student:students)student.getSchool().getOwners.size(); 

但是這樣會產生另一個distinct SQL查詢。

但我想在單個查詢中這樣做可能嗎?

我試試。

final Criteria criteria = session.createCriteria(Student.class) 
.add(filters); 
final Criteria ownerCriteria = criteria 
      .createCriteria("school","school")    
      .createAlias("owners","owners"); 
final List<Student>students = criteria.list(); 

但是,這並不工作,因爲當我通過它

導航
for(final Student student:students)student.getSchool().getOwners.size(); 

Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role 

拋出異常!甚至我可以看到在Hibernate SQL console..inner join但似乎Owner集合不填充....

任何解決方法或我問得多

任何幫助是巨大的讚賞來自委內瑞拉的問候..

+0

您可以使用一個fetch連接,但在這種情況下,你想獲取一個延遲初始化集合('java.util.Set')這又需要昂貴的收藏獲取在其中是als o可能會從Hibernate獲得警告。在這種情況下,最好是執行一個單獨的查詢來取回集合。 (你可以爲所有者的關係指定'fetch = FetchType.EAGER',但是這是(非常)不鼓勵的,我個人非常不喜歡它,這只是一種解決方法,而不是實際的解決方案)。 – Tiny 2015-02-17 23:48:22

+0

在School-> getOwner中使用fetch = FetchType.EAGER,但它爲什麼不能使用標準方法工作? – chiperortiz 2015-02-17 23:56:23

回答

1

你可以使用

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
+0

請更新實體類映射的詳細信息,您可能需要使用FetchType.EAGER加載所有關係,否則在休眠會話關閉之前使用FetchType.LAZY加載所有必需的對象。 – nayakam 2015-02-17 23:38:19

+0

我使用所有的關係作爲LAZY ..我不想生成幾個SQL查詢我會喜歡,如果我只能在1查詢.... – chiperortiz 2015-02-17 23:43:46