निम्नलिखित जेपीक्यूएल क्वेरी पर विचार करें:JPA 2 CriteriaQuery के रूप में "कहां" खंड के साथ जेपीक्यूएल "fetch में शामिल हों" को सही ढंग से कैसे व्यक्त करें?
SELECT foo FROM Foo foo
INNER JOIN FETCH foo.bar bar
WHERE bar.baz = :baz
मैं इसे क्रिटिएरिया क्वेरी में अनुवाद करने की कोशिश कर रहा हूं। यह जहां तक मैंने प्राप्त किया है:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Foo> cq = cb.createQuery(Foo.class);
Root<Foo> r = cq.from(Foo.class);
Fetch<Foo, Bar> fetch = r.fetch(Foo_.bar, JoinType.INNER);
Join<Foo, Bar> join = r.join(Foo_.bar, JoinType.INNER);
cq.where(cb.equal(join.get(Bar_.baz), value);
यहां स्पष्ट समस्या यह है कि मैं वही दो बार जुड़ रहा हूं, क्योंकि Fetch<Foo, Bar>
में Path
प्राप्त करने की कोई विधि नहीं है। क्या दो बार जुड़ने से बचने का कोई तरीका है? या क्या मुझे एक पुराने प्रश्न के साथ अच्छे पुराने जेपीक्यूएल के साथ रहना होगा?
अच्छा, धन्यवाद, लेकिन मैं मानक एपीआई के साथ ज्यादा चिपकना चाहता हूं और अतिरिक्त तृतीय पक्ष पुस्तकालयों से बचने की कोशिश करता हूं। यदि मैं जेपीए मानदंड एपीआई के साथ क्या करना चाहता हूं, तो शायद मैं सिर्फ सादे जेपीक्यूएल के साथ रहूंगा। – chris
क्या आपने अपनी समस्या हल की है? मुझे एक ही समस्या है। लाने के लिए प्राप्त नहीं किया जा सकता है, और मुझे Fetch से पथ नहीं मिल सकता है। यह व्यावहारिक रूप से अनुपयोगी है। केवल समाधान दो समान जुड़ना है, जो स्वीकार्य नहीं है। – svlada
खैर, जेम्स का जवाब इस मुद्दे की जड़ को काफी अच्छी तरह से वर्णन करता है। आप बस इसे इस तरह से नहीं कर सकते हैं, और यह एक ध्वनि डिजाइन निर्णय है। अगर मुझे सही याद है, तो मैं वास्तव में दो बार शामिल हो गया। कहा जा रहा है कि, यदि मेरे पास विकल्प है, तो मैं पहले कभी जेपीए का उपयोग नहीं करूंगा, क्योंकि मुझे लगता है कि यह एक बेकार अमूर्त परत है जो अंतर्निहित कार्यान्वयन को बढ़ावा देने के दौरान अनावश्यक जटिलता को जोड़ती है। – chris