2010-03-13 12 views
12

मैं जेपीए के लिए नया हूं।जेपीए जहां कोई भी

जेपीए में, क्वेरी है:

Query query = entityManager.createQuery("select o from Product o WHERE o.category = :value"); 
query.setParameter("category", category); 

मैं कैसे जेपीए में किसी भी श्रेणी के लिए श्रेणी सेट कर सकते हैं? तो अगर शून्य श्रेणी पारित हो जाती है, तो मैं श्रेणी पैरामीटर को अनदेखा करता हूं, सभी उत्पादों का चयन करता हूं।

उत्तर

0

चुनें * उत्पाद से जहां श्रेणी = *

मुझे लगता है कि आप भी एसक्यूएल के लिए नए हैं।

WHERE CATEGORY = * का मतलब "कोई श्रेणी" नहीं है (यह वैध SQL भी नहीं है)।

एसक्यूएल और जेपीए दोनों में, आपके पास WHERE क्लॉज नहीं होगा यदि आप कोई श्रेणी चाहते हैं (या एसक्यूएल में आपके पास WHERE CATEGORY IS NOT NULL हो सकता है)।

+0

गलत SQL क्वेरी के लिए खेद है :) आपका समाधान "जहां श्रेणी पूर्ण नहीं है" अच्छा है, लेकिन मुझे एक और क्वेरी बनाना है। क्या कोई अन्य तरीका एक प्रश्न सहेज सकता है? –

15

मैं जेपीए में किसी भी श्रेणी में श्रेणी कैसे सेट कर सकता हूं? तो अगर शून्य श्रेणी पारित हो जाती है, तो मैं श्रेणी पैरामीटर को अनदेखा करता हूं, सभी उत्पादों का चयन करता हूं।

आपको यहां गतिशील रूप से क्वेरी बनाना होगा। HQL (यह एक सरल उदाहरण है) के साथ:

Map<String, Object> params = new HashMap<String, Object>(); 
StringBuffer hql = new StringBuffer("from Product p"); 
boolean first = true; 

if (category != null) { 
    hql.append(first ? " where " : " and "); 
    hql.append("p.category = :category"); 
    params.put("category", category); 
} 

// And so on... 

Query query = session.createQuery(hql.toString()); 

Iterator<String> iter = params.keySet().iterator(); 
while (iter.hasNext()) { 
    String name = iter.next(); 
    Object value = params.get(name); 
    query.setParameter(name, value); 
} 

List results = query.list() 

लेकिन, वास्तव में, मेरी सिफारिश यहाँ मानदंड एपीआई का उपयोग करने होगा:

Criteria criteria = session.createCriteria(Product.class); 
if (category != null) { 
    criteria.add(Expression.eq("category", category); 
} 
// And so on... 
List results = criteria.list(); 

बहुत जटिल गतिशील प्रश्नों के लिए सरल।

+0

मानदंड गतिशील प्रश्नों के लिए एक बेहतर समाधान है। Expression.eq को बहिष्कृत किया गया है, इसके बजाय आप Restrictions.eq – Gere

4

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

select o from Product o WHERE :value is null or :value='' or o.category = :value 
+0

हैलो का उपयोग कर सकते हैं, मुझे आश्चर्य है कि इस पोस्ट से पूछताछ के साथ इस प्रकार का मूल्यांकन करना संभव है http: // stackoverflow।com/प्रश्न/570,229/हाइबरनेट-HQL क्वेरी है कि कैसे करने के लिए सेट एक संग्रह के रूप में एक नाम पैरामीटर-के-एक-क्वेरी। तो यह क्वेरी मेरे प्रोजेक्ट में निम्नानुसार काम नहीं कर रही है: Foo कहां आईडी =: आईडी और (: बारलिस्ट शून्य या बार (बारलिस्ट) है) –

1

मैं कैसे जेपीए में किसी भी श्रेणी के लिए श्रेणी सेट कर सकते हैं? तो यदि शून्य श्रेणी पास हो गई है, तो मैं श्रेणी पैरामीटर को अनदेखा करता हूं, सभी उत्पादों का चयन करता हूं।

आप श्रेणी को "%" पर सेट कर सकते हैं। यदि (श्रेणी == शून्य) query.set पैरामीटर ("श्रेणी", "%"); अन्य क्वेरी.सेट पैरामीटर ("श्रेणी", श्रेणी);

1

आप लगभग छोटे बदलाव के साथ सही हैं।

Query query = entityManager.createQuery("select o from Product o WHERE o.category = :value"); 
query.setParameter("value", category); 
setParamater में

"मूल्य" (सटीक पाठ) साथ मेल खाना चाहिए ": मूल्य" क्वेरी में