JPQL क्लॉज में: जावा-एरेज़ (या सूची, सेट…)?


108

मैं उन सभी वस्तुओं को लोड करना चाहूंगा जिनके पास हमारे डेटाबेस से मानों की एक छोटी लेकिन मनमानी संख्या में से किसी के लिए एक पाठ टैग सेट है। SQL में इस बारे में जाने का तार्किक तरीका एक "IN" क्लॉज बनाना होगा। JPQL IN के लिए अनुमति देता है, लेकिन मुझे हर एक पैरामीटर को सीधे IN में निर्दिष्ट करने की आवश्यकता होती है (जैसे, "in: (in1,: in2,: in3)")।

क्या किसी सरणी, या एक सूची (या कुछ अन्य कंटेनर) को निर्दिष्ट करने का कोई तरीका है जिसे IN खंड में मानों को अनियंत्रित किया जाना चाहिए?

जवाबों:


208

मुझे JPA 1.0 पर यकीन नहीं है, लेकिन आप CollectionJPA 2.0 में पास कर सकते हैं :

String qlString = "select item from Item item where item.name IN :names"; 
Query q = em.createQuery(qlString, Item.class);

List<String> names = Arrays.asList("foo", "bar");

q.setParameter("names", names);
List<Item> actual = q.getResultList();

assertNotNull(actual);
assertEquals(2, actual.size());

EclipseLInk के साथ परीक्षण किया गया। हाइबरनेट 3.5.1 के साथ, आपको कोष्ठक के साथ पैरामीटर को घेरना होगा:

String qlString = "select item from Item item where item.name IN (:names)";

लेकिन यह एक बग है, पिछले नमूने में JPQL क्वेरी मान्य JPQL है। HHH-5126 देखें ।


5
क्या "क्लॉज" में उपयोग करने के लिए अधिकतम संख्या है?
गोंडिम

3
हाइबरनेट में उपर्युक्त बग को संस्करण 3.6.1 में तय किया गया लगता है
डेनिस नियाज़ेव

1
@pringlesinn इन-क्लॉज में मूल्यों की संख्या आपके DBMS पर निर्भर करती है
टिम ब्यूटे

जेपीए 1.0 में काम करता है (और इसका कोई अनिवार्य कोष्ठक के साथ घेरना नहीं है, लेकिन पठनीयता के लिए आपको चाहिए)
जेवियर लिवर्स

क्या होगा अगर आप => item.name में (जैसे: नाम)
dzgeek

3

ओरेकल सीमा 1000 पैरामीटर है। समस्या को 4.1.7 संस्करण में हाइबरनेट द्वारा हल किया गया है, हालांकि 500 ​​के सेट में पारित पैरामीटर सूची को विभाजित करके JIRA HHH-1123 देखें


1
दुर्भाग्य से यह हल नहीं किया गया था। टिकट को हल के रूप में चिह्नित किया गया था, लेकिन समस्या (जैसा कि टिप्पणियों द्वारा दिखाया गया है) हाइबरनेट टीम द्वारा तय नहीं की गई थी।
जूल

@ ड्रेक उम कहां है? मैं 2016 से अधिक पुरानी कोई टिप्पणी नहीं देखता हूं। और वे केवल दो टिप्पणियां थीं जो कहती हैं कि व्यावहारिक रूप से सामान्य इंटरनेट के अलावा कुछ भी नहीं है 'हेल्प plz !!!' !!!! '। आपने बग रिपोर्ट को हल किए गए पर भरोसा करने का कोई कारण नहीं दिया है।
searchengine27

@ searchengine27 मैंने कहा कि रिपोर्ट को हल नहीं किया गया था , इसके बावजूद इसे हल किया गया। रिज़ॉल्यूशन, स्टीव एबर्सोल द्वारा रिपोर्ट किया गया था: "इसका संकल्प यह है कि हम केवल इस स्थिति का पता चलने पर लॉगिंग के माध्यम से उपयोगकर्ताओं को चेतावनी देने जा रहे हैं।" 2012 में नोएल ट्राउट की टिप्पणियां इस बात पर विस्तार करती हैं कि यह पर्याप्त क्यों नहीं है।
ड्रोन

दूसरे शब्दों में, यह उत्तर गलत है या, सबसे अच्छा, भ्रामक है।
ड्रोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.