2009-07-23 4 views
5

का उपयोग कर निम्नलिखित जेपीए क्वेरी में जेपीए क्वेरी में एक नामित पैरामीटर के रूप में सूची,:TopLink

@NamedQuery(name = "SortTypeNWD.findByFcIds", query = "SELECT s FROM SortTypeNWD s WHERE s.sortTypeNWDPK.fcId IN (:fcIds)") 

काफी तार्किक, यह क्या किया जाता है जब यह है: fcIds पैरामीटर का नाम पूर्णांक मानों की सूची होने की जरूरत है नामित क्वेरी कहा जाता है:

Query findByDatesPlFcIds = em.createNamedQuery("SortTypeNWD.findByFcIds"); 
findByDatesPlFcIds.setParameter("fcIds", fcIds); 

कहाँ चर fcIds पूर्णांकों युक्त एक ArrayList है।

उपरोक्त सभी कोड हाइबरनेट साथ ठीक काम करता है लेकिन TopLink साथ नहीं करता है:

Caused by: java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.ArrayList for parameter fcIds with expected type of int from query string SELECT s FROM SortTypeNWD s WHERE s.sortTypeNWDPK.fcId IN (:fcIds). 

वहाँ TopLink में एक नामित पैरामीटर के रूप में एक सूची का उपयोग करने के एक समाधान है? नामित पैरामीटर के प्रकार को मजबूर किया जा सकता है?

उत्तर

0

मुझे एक समान आवश्यकता का सामना करना पड़ा, और जब मैंने क्वेरी बदल दिया .setParameter ("fcIds", fcIds) सेट पैरामीटर लिस्ट ("एफसीआईडीएस", एफसीआईडीएस)। एकमात्र अंतर यह था कि हाइबरनेट (मैं टॉपलिंक का उपयोग नहीं कर रहा हूं) का उपयोग करते समय मुझे यह परिवर्तन करने की आवश्यकता थी, लेकिन आपका केस बनाम जहां आप सेट पैरामीटर() को हाइबरनेट के साथ काम करना प्रतीत होता था।

4

टॉपलिंक जेपीए 1.0 लागू करता है जो एक पैरामीटर के रूप में एक सूची उत्तीर्ण करने का समर्थन नहीं करता है (संग्रह_valued_input_parameter शब्द प्रलेखन में उपयोग किया जाता है)। यह जेपीए 2.0 में समर्थित है जो टॉपलिंक के उत्तराधिकारी, एक्लिप्ससेंक में कार्यान्वित किया गया है।

यदि आपको टॉपलिंक के साथ रहना है तो आपको पैरामीटर के रूप में सूची में प्रत्येक आइटम को शामिल करने के लिए एक लूप लिखना होगा।

+1

नामित क्वेरीज़ में शामिल करने के लिए कौन सा उज्ज्वल विचार था और नेट नामांकित क्वेरी नहीं? मैं यह पता लगाने की कोशिश कर रहा था कि मेरी क्वेरी क्यों काम नहीं करेगी, दो घंटों की खोज कर रही थी। – SoftwareSavant

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