2015-05-06 5 views
11

में लाने मैं संस्थाओं नीचे है:एकाधिक में शामिल होने के एक JPQL क्वेरी

public class Category { 
    private Integer id; 
    @OneToMany(mappedBy = "parent") 
    private List<Topic> topics; 
} 

public class Topic { 
    private Integer id; 
    @OneToMany(mappedBy = "parent") 
    private List<Posts> posts; 
    @ManyToOne 
    @JoinColumn(name = "id") 
    private Category parent; 
} 

public class Post { 
    private Integer id; 
    @ManyToOne 
    @JoinColumn(name = "id") 
    private Topic parent; 
    /* Post fields */ 
} 

और मैं शामिल विषयों के साथ सभी श्रेणियों लाने चाहते हैं और JPQL क्वेरी का उपयोग पदों में शामिल हो गए। मैं नीचे की तरह क्वेरी ने लिखा था:

SELECT c FROM Category c JOIN FETCH c.topics t JOIN FETCH t.posts p WHERE ... 

लेकिन मैं त्रुटि

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 

मैं इस त्रुटि के बारे लेख नहीं मिले है, लेकिन इन लेखों को केवल उसी परिस्थिति एक इकाई में शामिल होने के लिए दो संग्रह कर रहे हैं का वर्णन। मेरी समस्या थोड़ा अलग है और मुझे नहीं पता कि इसे कैसे हल किया जाए।

एक प्रश्न में करना संभव है?

मेरा बुरा अंग्रेजी के लिए क्षमा करें, लेकिन मैं आम तौर पर अन्य भाषा में बोलना

उत्तर

22

आप एक Child-Parent fetch strategy का उपयोग करें और परिणाम से इकाई पेड़ पुनः संयोजित कर सकते हैं।

SELECT p 
FROM Post p 
JOIN FETCH p.topic t 
JOIN FETCH t.category c 
WHERE ... 
+1

उल्लेख इस के अंत में है लेख आपको कहा गया था: "हालांकि अनुक्रमित सूचियों या समूह का उपयोग करना हमेशा बेहतर होता है"। अनुक्रमित सूची कैसे बनाएं? – Zaprogramowany

+0

यह एक और प्रश्न का विषय है, जो मुझे यकीन है कि यह पहले ही एसओ पर उत्तर दिया गया है। –

1

यहाँ परिसर का एक काम कर उदाहरण में शामिल होने और कई consition है:

String query_findByProductDepartmentHospital = "select location from ProductInstallLocation location " 
      + " join location.product prod " + " join location.department dep " 
      + " join location.department.hospital hos " + " where prod.name = :product " 
      + " and dep.name.name = :department " + " and hos.name = :hospital "; 

    @Query(query_findByProductDepartmentHospital) 
    ProductInstallLocation findByProductDepartmentHospital(@Param("product") String productName,@Param("department") String departName, @Param("hospital") String hospitalName); 
संबंधित मुद्दे