2011-06-08 13 views
20

में आईपी क्लॉज में जेपीए पासिंग सूची मुझे पता है कि मैं जेपीए में नामित क्वेरी में एक सूची पास कर सकता हूं, लेकिन NamedNativeQuery के बारे में कैसे? मैंने कई तरीकों की कोशिश की है लेकिन अभी भी सूची को NamedNativeQuery पर पास नहीं कर सकता है। किसी को पता है कि NamedNativeQuery में खंड में सूची कैसे पास करें? आपका बहुत बहुत धन्यवाद!नामित देशी क्वेरी

NamedNativeQuery रूप में नीचे है:

@NamedNativeQuery(
    name="User.findByUserIdList", 
    query="select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
     "where u.user_id in (?userIdList)" 
) 

और इसे इस तरह कहा जाता है:

List<Object[]> userList = em.createNamedQuery("User.findByUserIdList").setParameter("userIdList", list).getResultList(); 

हालांकि परिणाम के रूप में मैं उम्मीद नहीं है।

System.out.println(userList.size()); //output 1 

Object[] user = userList.get(0); 
System.out.println(user.length); //expected 5 but result is 3 
System.out.println(user[0]);  //output MDAVERSION which is not a user_id 
System.out.println(user[1]);  //output 5 
System.out.println(user[2]);  //output 7 
+0

आप ठीक उसी क्वेरी अपने डीबी ग्राहक का उपयोग कर क्रियान्वित करने की कोशिश की है? –

उत्तर

14

एक सूची मूल SQL क्वेरी के लिए मान्य पैरामीटर नहीं है, क्योंकि यह जेडीबीसी में बंधी नहीं जा सकती है। सूची में प्रत्येक तर्क के लिए आपको पैरामीटर होना चाहिए।

जहां u.user_id में (? ID1,? आईडी 2)

यह JPQL के माध्यम से तो आप एक देशी क्वेरी के बजाय JPQL इस्तेमाल कर सकते हैं समर्थित है, लेकिन नहीं एसक्यूएल,।

कुछ जेपीए प्रदाता इसका समर्थन कर सकते हैं, इसलिए आप अपने प्रदाता के साथ एक बग लॉग करना चाह सकते हैं।

+3

प्रश्न कैसे है ... – SoftwareSavant

1

जेपीए 2 में हाइबरनेट के साथ प्रदाता के रूप में प्रयास किया गया और ऐसा लगता है कि हाइबरनेट "आईएन" की सूची में लेने का समर्थन करता है और यह काम करता है। (कम से कम नामित प्रश्नों के लिए और मेरा मानना ​​है कि यह नामित प्रश्नों के साथ समान होगा) आंतरिक रूप से हाइबरनेट आंतरिक रूप से गतिशील पैरामीटर उत्पन्न करता है, जैसा कि उत्तीर्ण सूची में तत्वों की संख्या के समान होता है।

तो ऊपर

List<Object[]> userList = em.createNamedQuery("User.findByUserIdList").setParameter("userIdList", list).getResultList(); 

आप उदाहरण में सूची 2 तत्व है, तो क्वेरी

select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
     "where u.user_id in (?, ?) 

की तरह दिखाई देगा और यह

select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
     "where u.user_id in (?, ?, ?) 
-1

आप की तरह लग रहा है अगर यह 3 तत्व है को आजमा सकते हैं: के बजाय userIdList (? UserIdList)

@NamedNativeQuery(
     name="User.findByUserIdList", 
     query="select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
      "where u.user_id in :userIdList" 
) 
0

अपने डेटाबेस/प्रदाता/चालक/आदि पर निर्भर करता है।, आप, वास्तव में, एक सूची एक जेपीए देशी क्वेरी के लिए एक बाध्य पैरामीटर के रूप में पारित कर सकते हैं।

उदाहरण के लिए, पोस्टग्रेस और एक्लिप्ससेंक के साथ, निम्नलिखित कार्य (सत्य लौट रहे हैं), बहुआयामी सरणी का प्रदर्शन और डबल परिशुद्धता की सरणी कैसे प्राप्त करें। इसलिए शाब्दिक सरणी बल्कि सांख्यिक से युगल के है

Array test = entityManager.unwrap(Connection.class).createArrayOf("float8", new Double[][] { { 1.0, 2.5 }, { 4.1, 5.0 } }); 
Object result = entityManager.createNativeQuery("SELECT ARRAY[[CAST(1.0 as double precision), 2.5],[4.1, 5.0]] = ?").setParameter(1, test).getSingleResult(); 

डाली है; (शायद _ रहती है, लेकिन यह प्रयोग करने से पहले इसे बंद पट्टी अन्य प्रकार के लिए SELECT pg_type.* FROM pg_catalog.pg_type करो।)।

प्रश्न के बिंदु पर अधिक - मुझे नहीं पता कि आप नाम कैसे पूछ सकते हैं या नहीं; मुझे लगता है कि यह निर्भर करता है, शायद। लेकिन मुझे लगता है कि निम्नलिखित ऐरे सामान के लिए काम करेगा।

Array list = entityManager.unwrap(Connection.class).createArrayOf("int8", arrayOfUserIds); 
List<Object[]> userList = entityManager.createNativeQuery("select u.* from user u "+ 
    "where u.user_id = ANY(?)") 
    .setParameter(1, list) 
    .getResultList(); 

मैं ओ पी के रूप में ही स्कीमा की जरूरत नहीं है, इसलिए मैं वास्तव में इस की जाँच नहीं की है, लेकिन मुझे लगता है कि यह काम करना चाहिए - फिर से, कम से कम Postgres & EclipseLink पर।

इसके अलावा, कुंजी मिला था में: http://tonaconsulting.com/postgres-and-multi-dimensions-arrays-in-jdbc/

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