मैं मानदंड एपीआई मूल रूप से पहली बार उपयोग कर रहा हूँ वाम वैकल्पिक संबंधों के लिए शामिल हों। यह एक सामान्य बिल्डर के लिए प्रश्नों सार संक्षेप के बारे में बताया गया है:जेपीए मानदंड एपीआई:
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
IIRC समस्या का उपयोग कर कि हम वाक्य रचना में शामिल होने छोड़ दिया गया हो गया था खंडों के लिए, लेकिन आदेश बाई के लिए मानक जुड़ने का उपयोग कर रहे थे, जो पिछली बाएं जुड़ने के लिए लग रहा था। – Kawu