2011-07-24 16 views
11

मैं एक क्वेरी चलाने की कोशिश कर रहा हूं जो जांचता है कि कुछ स्थितियां सत्य हैं या आउटपुट के रूप में एक साधारण बूलियन परिणाम देता है। यह थोड़ा मुश्किल बनाता है कि शर्तों में से एक यह जांचना है कि मानदंडों के सेट के लिए कोई परिणाम नहीं लौटाया गया है या नहीं।जेपीक्यूएल में संभव है() संभव है?

मैं वर्तमान में जेपीए-2.0 का उपयोग कर रहा हूं, मेरे प्रदाता के रूप में हाइबरनेट के साथ, MySQL द्वारा समर्थित। मुझे MySQL में ठीक काम करने वाली एक उदाहरण क्वेरी मिली है, लेकिन जब इसे जेपीक्यूएल में चलाने की कोशिश की जाती है तो यह फ्लॉप हो जाती है। MySQL क्वेरी इस तरह एक सा दिखता है:

Select exists(Select statement with criteria) 
    or not exists(Select statement with criteria); 

मैं भी यही उत्पादन मामला का उपयोग कर गया, लेकिन JPQL कि बयान का समर्थन नहीं करता है।

"unexpected end of subtree"

जो मेरी समझ से इसका मतलब है कि कुछ क्वेरी में याद आ रही है:

फिर भी, जब मैं JPQL में एक समान क्वेरी का उपयोग करने की कोशिश मैं त्रुटि मिलती है। क्या किसी को यह पता है कि इसे कैसे ठीक किया जाए?

उत्तर

6

कोष्ठक की जरूरत नहीं है नहीं, यह संभव नहीं है।

ऑरैकल से JPQL BNF दस्तावेज़ीकरण का संदर्भ लें।

simple_cond_expression ::= comparison_expression | between_expression | like_expression | in_expression | null_comparison_expression | empty_collection_comparison_expression | collection_member_expression | exists_expression

exists_expression ::= [NOT] EXISTS(subquery)

1

आपके पास मेल नहीं खाए गए ब्रैकेट हैं। not से पहले एक (और चारों ओर पहले से मौजूद है वाले) को हटाने का प्रयास करें:

select exists(Select statement with criteria) 
    or not exists(Select statement with criteria); 

आप चारों ओर exists()

+1

इसे इंगित करने के लिए धन्यवाद, लेकिन ब्रैकेट या कोई क्वेरी अभी भी जेपीक्यूएल में काम नहीं करती है। – Elk

+0

http://openjpa.apache.org/builds/1.2.0/apache-openjpa-1.2.0/docs/manual/jpa_langref.html#jpa_langref_exists तो दस्तावेज़ीकरण के अनुसार कम से कम मौजूद हिस्सा प्रश्न से सही है। "exist_expression :: = [NOT] EXISTS (सबक्वायरी)" – Kowser

1

वैकल्पिक रूप से आप एक select count(...) का उपयोग करें और परीक्षण करते हैं कि यह रिटर्न 0 सकता है। यह लगभग अधिक कोड लिखने के बिना लगभग उतना ही कुशल होना चाहिए (वास्तव में, क्वेरी स्वयं शायद सरल दिखाई देगी)।

+1

जरूरी नहीं है। 'परिणाम (...) 'पहले परिणाम खोजने के बाद शायद मौजूद होगा। 'गिनती (...) को वास्तविक गणना निर्धारित करने के लिए कई और अनुक्रमणिका/तालिका पंक्तियों को स्कैन करना होगा। –

+0

@ कोनराडगास: हालांकि वास्तव में कोई फर्क नहीं पड़ता, जब 'गिनती (..)' एकमात्र समाधान है जो किसी भी तरह से जेपीक्यूएल में काम करेगा। तो, जब जीवन आपको नींबू देता है ... –

4

आप case expression का उपयोग करके एक बूलियन क्वेरी कर सकते हैं।

जेपीए 2.0 (जावा ईई 6) के रूप में आप create a TypedQuery कर सकते हैं।

String query = "select case when (count(*) > 0) then true else false end from ......" 
TypedQuery<Boolean> booleanQuery = entityManager.createQuery(query, Boolean.class); 
boolean exists = booleanQuery.getSingleResult(); 

जेपीए 1.0 (जावा ईई 5) में आपको एक अटूट क्वेरी का उपयोग करना होगा।

Query booleanQuery = entityManager.createQuery(query); 
boolean exists = (Boolean) booleanQuery.getSingleResult(); 
1

एक परियोजना

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.2.4.Final</version> 
    </dependency> 
    ... 

का उपयोग करता है में मैं सफलतापूर्वक एक

exists(select s.primaryKey from Something s) 

खंड का इस्तेमाल किया। तो यह बदल सकता है। यह हाइबरनेट-मालिकाना भी हो सकता है। चूंकि बहुत से लोग एक दृढ़ता प्रदाता के रूप में हाइबरनेट का उपयोग करते हैं, मैंने सोचा कि मैं इसे यहां जोड़ सकता हूं।

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