2015-11-18 7 views
6

पर विचार करें निम्नलिखित मॉडलजेपीए: कैसे बेसब्री से एक एम्बेडेड तत्व संग्रह

@Entity 
// JPA and JAXB annotations here 
public class Employee implements Serializable { 
    // other fields, annotations, stuffs 
    ... 
    @ElementCollection(fetch = FetchType.LAZY, 
     targetClass = Address.class) 
    @CollectionTable(name = "employee_address", 
     schema = "hris", 
     joinColumns = @JoinColumn(name = "employee_id", 
       nullable = false, 
       referencedColumnName = "employee_id", 
       foreignKey = @ForeignKey(ConstraintMode.CONSTRAINT))) 
    protected Set<Address> addresses; 
    // setters, getters 
    ... 
} 

@Embeddable 
// JAXB annotations here 
public class Address implements Serializable { 
     // fields, setters, getters 
} 

Address वर्ग @Embeddable टिप्पणी के साथ टिप्पणी की जाती है, और Employee वर्ग addresses की एक एम्बेडेड तत्व संग्रह है लाने के लिए। तत्व संग्रह का fetchFetchType.LAZY पर सेट है। अब, मैं @NamedQuery बनाना चाहता हूं जो सभी कर्मचारियों को उत्सुकतापूर्वक प्रारंभ किए गए पते के साथ पुनर्प्राप्त करेगा। यह जानकर कि JOIN FETCHwill only work with entity collections जेपीए 2.1 के आधार पर @OneToMany या @ManyToMany के साथ एनोटेटेड, मैं एक वैध JPQL क्वेरी कैसे बनाऊंगा जो मुझे एम्बेडेड तत्व संग्रह को उत्सुकता से पुनर्प्राप्त करने की अनुमति देगी?

+0

आपने कैसे निष्कर्ष निकाला कि 'fetch' में शामिल हों केवल इकाइयों के साथ काम करता है? क्या आपने इसे आज़माया? –

+0

@DraganBozanovic: प्रलेखन के आधार पर, "फ़ेच जॉइन क्लॉज के दाईं ओर संदर्भित एसोसिएशन एक ऐसा संगठन होना चाहिए जो क्वेरी के परिणामस्वरूप लौटाई गई इकाई से संबंधित हो। इसे निर्दिष्ट करने की अनुमति नहीं है फ़ेच जॉइन क्लॉज के दाईं ओर संदर्भित इकाइयों के लिए पहचान चर, और इसलिए पूरी तरह से प्राप्त इकाइयों के संदर्भ क्वेरी में कहीं और नहीं दिखाई दे सकते हैं। " –

+0

संग्रह-मूल्यवान पथ को एक एसोसिएशन फ़ील्ड को हल करना होगा –

उत्तर

2

जेपीए 2.1 विनिर्देश (जेएसआर 338) में मुझे कोई संकेत नहीं मिल रहा है जो केवल इकाई संबंधों (लेकिन एम्बेड करने योग्य नहीं) पर काम करता है। JSR 338, खंड 4.4.5.3 भी कहा गया है:

एक FETCH JOIN एक प्रश्न के निष्पादन का एक पक्ष प्रभाव के रूप में एक संघ या तत्व संग्रह फ़ेच सक्षम बनाता है।

एक और संकेत निम्नलिखित न्यूनतम उदाहरण (अनिवार्य रूप से तुम्हारा जैसी) हाइबरनेट 4.3.11 के साथ निष्पादित के रूप में किसी एक क्वेरी में जेपीए प्रदाता परिणाम के रूप में:

पता एम्बेड करने योग्य:

@Embeddable public class Address { private String city; } 

कर्मचारी इकाई:

@Entity public class Employee { 

    @Id private Long id; 

    @ElementCollection(fetch = FetchType.LAZY) 
    @CollectionTable(name = "address", 
      joinColumns = @JoinColumn(name="employee_id")) 
    private Set<Address> addresses; 

} 

JPQL क्वेरी:

em.createQuery("select e from Employee e join fetch e.addresses").getResultList(); 

परिणामस्वरूप SQL क्वेरी:

select 
    employee0_.id as id1_1_, 
    addresses1_.employee_id as employee1_1_0__, 
    addresses1_.city as city2_5_0__ 
from 
    Employee employee0_ 
inner join 
    address addresses1_ on employee0_.id=addresses1_.employee_id 

तो ऊपर JPQL क्वेरी अपनी समस्या को हल करने के लिए लगता है।

2

वैसे, अधिक प्रभावी तरीके से शामिल होने का उपयोग करने के नहीं हो सकता है, लेकिन सबसिलेक्ट

@Fetch(FetchMode.SUBSELECT) 
@BatchSize(size=500) 

यह दो चयन के बजाय एक करता है, लेकिन इतना अस्पष्टता का उत्पादन नहीं करता।

संबंधित मुद्दे