एक जेपीए क्वेरी में खंड सूची में जोड़ना


124

मैंने एक NamedQuery बनाया है जो इस तरह दिखता है:

@NamedQuery(name = "EventLog.viewDatesInclude",
        query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
        + "el.timeMark <= :dateTo AND "
        + "el.name IN (:inclList)")

मैं जो करना चाहता हूं वह पैरामीटर में भरा गया है: एक आइटम के बजाय आइटम की सूची के साथ झुकाव। उदाहरण के लिए अगर मेरे पास एक new List<String>() { "a", "b", "c" }तरीका है जो मुझे इसमें है: inclList पैरामीटर? यह केवल मुझे एक स्ट्रिंग को संहिताबद्ध करने देता है। उदाहरण के लिए:

setParameter("inclList", "a") // works

setParameter("inclList", "a, b") // does not work

setParameter("inclList", "'a', 'b'") // does not work

setParameter("inclList", list) // throws an exception

मुझे पता है कि मैं बस एक स्ट्रिंग बना सकता हूं और उससे पूरी क्वेरी का निर्माण कर सकता हूं, लेकिन मैं ओवरहेड से बचना चाहता था। क्या ऐसा करने का कोई बेहतर तरीका है?

संबंधित प्रश्न: यदि सूची बहुत बड़ी है, तो क्या इस तरह क्वेरी बनाने का कोई अच्छा तरीका है?


यह stackoverflow.com/questions/1557085/… का डुप्लिकेट है, लेकिन यह धागा उपयोगी उत्तर प्रदान करता है।
माइक रयान

जवाबों:


181

INसंग्रह-मूल्यवान पैरामीटर का उपयोग करते समय आपको आवश्यकता नहीं होती है (...):

@NamedQuery(name = "EventLog.viewDatesInclude", 
    query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND " 
    + "el.timeMark <= :dateTo AND " 
    + "el.name IN :inclList") 

6
नहीं ... मैं अपने मामले इसके विपरीत। अगर मैं उपयोग करता हूं: inclList तो इसका काम नहीं है। अगर मैं IN (: inclList) का उपयोग करता हूं तो यह काम करता है।
गुंजन शाह

1
उल्लेख भी नोट करें: आपके परम के प्रकार को वस्तुओं का संग्रह (सरणी नहीं) होना चाहिए। ऑब्जेक्ट को फ़ील्ड के प्रकार से मेल खाना चाहिए। .toString () कक्षा स्ट्रिंग के लिए कोई विकल्प नहीं है
dub

2
मुझे लगता है कि यह एक ऐसी चीज है जो हाइबरनेट के संस्करणों के साथ बदल गई है, जहां तक ​​मुझे याद है कि आईएन का उपयोग करते समय चर के आसपास पैरेन्थेसिस नहीं होने पर मुझे एक त्रुटि मिली है। अजीब है अगर यह पीछे की ओर संगत नहीं है ..
टोबेब

1
यह वास्तव में एक हाइबरनेट बग (कोष्ठक की आवश्यकता) है जो कि 3.6.1 में तय किया गया है
Mat

1
संबंधित प्रश्न के लिए: बहुत बड़ी सूची के मामले में कार्यान्वयन के लिए सीमाएं हो सकती हैं। जैसे oracle 11 ग्रा। अधिकतम। पैरामीटर के रूप में 1000 सूची तत्व संभव हैं। उप-सूची में सूची को काटने और परिणाम एकत्र करने के लिए एक वर्कअराउंड है। JPA स्वयं सूची आकार को प्रतिबंधित नहीं करता है।
महतीस श्रेयाबर

81

उचित JPA क्वेरी प्रारूप होगा:

el.name IN :inclList

यदि आप अपने प्रदाता के रूप में हाइबरनेट के पुराने संस्करण का उपयोग कर रहे हैं तो आपको लिखना होगा:

el.name IN (:inclList)

लेकिन यह एक बग ( HHH-5126 ) (EDIT: जो अब तक हल हो गया है) है।


5
हाइबरनेट उपयोग के पुराने संस्करणों को अलग करने के लिए धन्यवाद ()
रोब एल

31
public List<DealInfo> getDealInfos(List<String> dealIds) {
        String queryStr = "SELECT NEW com.admin.entity.DealInfo(deal.url, deal.url, deal.url, deal.url, deal.price, deal.value) " + "FROM Deal AS deal where deal.id in :inclList";
        TypedQuery<DealInfo> query = em.createQuery(queryStr, DealInfo.class);
        query.setParameter("inclList", dealIds);
        return query.getResultList();
    }

मेरे लिए JPA 2, Jboss 7.0.2 के साथ काम करता है


9

आपको Listनीचे दिखाए अनुसार बदलना होगा :

    String[] valores = hierarquia.split(".");       
    List<String> lista =  Arrays.asList(valores);

    String jpqlQuery = "SELECT a " +
            "FROM AcessoScr a " +
            "WHERE a.scr IN :param ";

    Query query = getEntityManager().createQuery(jpqlQuery, AcessoScr.class);                   
    query.setParameter("param", lista);     
    List<AcessoScr> acessos = query.getResultList();

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