2013-09-03 9 views
10

मैं मानदंड एपीआई मूल रूप से पहली बार उपयोग कर रहा हूँ वाम वैकल्पिक संबंधों के लिए शामिल हों। यह एक सामान्य बिल्डर के लिए प्रश्नों सार संक्षेप के बारे में बताया गया है:जेपीए मानदंड एपीआई:

public TypedQuery<T> newQuery(Manager<?,T> manager) 
{ 
    CriteriaBuilder builder = this.entityManager.getCriteriaBuilder(); 

    Class<T> genericClass = (Class<T>) ((ParameterizedType) manager.getClass().getGenericSuperclass()).getActualTypeArguments()[1]; 

    CriteriaQuery<T> criteriaQuery = builder.createQuery(genericClass); 
    Root<T> root = criteriaQuery.from(genericClass); 

    ... 
} 

कॉल criteriaQuery.from(genericClass); सभी रिश्तों डिफ़ॉल्ट रूप से इकाई पर पाया के लिए एसक्यूएल INNER JOIN उत्पन्न करता है। यह एक समस्या है, क्योंकि हर रिश्ते शून्य (डीबी NULL या एक डीबी है जो विदेशी कुंजी का उपयोग नहीं करता है और इसमें एक अवैध संदर्भ है) परिणाम समूह में उन इकाइयों को अनुपलब्ध कर दिया जाएगा, प्रभावी रूप से गलत खोज परिणामों का उत्पादन।

एक उदाहरण यहां पाया जा सकता: JPA Criteria query Path.get left join is it possibile

क्या मैं इस वर्ग द्वारा instantiated प्रश्नों के लिए होता है करना चाहते हैं/विधि है कि इकाई, यहाँ genericClass पर सभी रिश्ते, कि optional = true

के रूप में उल्लेख किया जाता है
@ManyToOne(FetchType.EAGER, optional = true) 
@JoinColumn(name = "CLOSE_USER_ID", referencedColumnName = "USER_ID") 
private User    closer; 

INNER JOIN के बजाय एक एसक्यूएल उत्पन्न करने के लिए LEFT (OUTER) JOIN

प्रश्न:

वहाँ मानक JPQ इस किया पाने के लिए रास्ता नहीं है? यदि हां, तो कैसे?

पीएस: आम तौर पर कंक्रीट प्रकार को जानने का कोई तरीका नहीं है, इसलिए मुझे जो कुछ भी चाहिए, वह हासिल करने में सक्षम हो सकता है, किसी प्रकार के मेटामोडेल का उपयोग करना और मैन्युअल रूप से जुड़ना (जो मुझे चाहिए बचने के लिए)।


हम EclipseLink 2.3

उत्तर

8

.from (वर्ग) का उपयोग कर रहे एक अंदरूनी सभी रिश्तों के लिए शामिल होने का उपयोग नहीं करता, यह केवल वर्ग प्रश्नों।

अगर आप में शामिल होने() या प्राप्त करें() API,() एक JoinType.LEFT साथ एक बाहरी उपयोग में शामिल होने के शामिल होने का उपयोग करने का उपयोग एक रिश्ता केवल पूछे दिया जाएगा।

https://en.wikibooks.org/wiki/Java_Persistence/Criteria#Join

मैं तुम्हें क्यों देख रहे हैं यकीन नहीं है के जुड़ने पर आपको बुला रहा है या नहीं, में शामिल होने के()। कुछ जेपीए प्रदाता स्वचालित रूप से सभी ईगर संबंधों को लाने में शामिल हो जाते हैं, यह हो सकता है कि आप जो देख रहे हों। मेरे पास हमेशा यह अजीब है, शायद आपके जेपीए प्रदाता को यह करने के लिए कॉन्फ़िगर करने के लिए दूर किया गया है, या आप संबंधों को LAZY बना सकते हैं।

+0

IIRC समस्या का उपयोग कर कि हम वाक्य रचना में शामिल होने छोड़ दिया गया हो गया था खंडों के लिए, लेकिन आदेश बाई के लिए मानक जुड़ने का उपयोग कर रहे थे, जो पिछली बाएं जुड़ने के लिए लग रहा था। – Kawu

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