2011-01-28 11 views
64

में मैं निम्नलिखित parametrised जेपीए, या हाइबरनेट, क्वेरी है:में-खंड HQL या जावा हठ क्वेरी लैंग्वेज

SELECT entity FROM Entity entity WHERE name IN (?) 

मैं एक ArrayList < स्ट्रिंग> के रूप में पैरामीटर पारित करने के लिए चाहते हैं, यह संभव है? हाइबरनेट वर्तमान मुझसे कहता है, कि

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String 

बिल्कुल यह संभव है?

उत्तर: संग्रह मापदंडों केवल ":name" की तरह नामित पैरामीटर आज़माना के रूप में, "?" की तरह JDBC शैली मानकों के साथ नहीं।

+1

क्या आप इस प्रश्न का उत्तर जोड़ना चाहते हैं? मुझे पता है कि यह एक पुराना है, लेकिन आपके प्रश्न का उत्तर देने की अनुमति केवल अनुमति नहीं है, इसे स्पष्ट रूप से प्रोत्साहित किया जाता है। – Makoto

उत्तर

123

आप हाइबरनेट के Query वस्तु का उपयोग कर रहे हैं, या जेपीए? हाइबरनेट के लिए

String jpql = "from A where name in (:names)"; 
Query q = em.createQuery(jpql); 
q.setParameter("names", l); 

, आप setParameterList का उपयोग करना होगा: जेपीए के लिए, यह ठीक काम करना चाहिए वास्तविक प्रदाता के रूप में हाइबरनेट 5.0.2.Final साथ

String hql = "from A where name in (:names)"; 
Query q = s.createQuery(hql); 
q.setParameterList("names", l); 
+0

ठीक है, समस्या का उपयोग कर रहा था? पैरामीटर को नामित करने के लिए। नामित पैरामीटर के साथ: पीटर यह काम करता है। – Daniel

+0

इसलिए आपको सूची में प्रत्येक स्ट्रिंग के लिए उद्धरण की आवश्यकता नहीं है? – CCC

+0

स्ट्रिंग [] सरणी को क्वेरी पैरामीटर के रूप में कैसे सेट करें – priyadarshini

18

एचक्यूएल में आप क्वेरी पैरामीटर का उपयोग कर सकते हैं और setParameterList विधि के साथ संग्रह सेट कर सकते हैं।

Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)"); 
    q.setParameterList("names", names); 
3

शुद्ध जेपीए का उपयोग करना निम्नलिखित स्थितीय मानकों के साथ काम करने के लिए और साथ ही लगता है:

Entity.java:

@Entity 
@NamedQueries({ 
    @NamedQuery(name = "byAttributes", query = "select e from Entity e where e.attribute in (?1)") }) 
public class Entity { 
    @Column(name = "attribute") 
    private String attribute; 
} 

Dao.java: बस बुला

public class Dao { 
    public List<Entity> findByAttributes(Set<String> attributes) { 
     Query query = em.createNamedQuery("byAttributes"); 
     query.setParameter(1, attributes); 

     List<Entity> entities = query.getResultList(); 
     return entities; 
    } 
} 
3

कोष्ठक बाहर छोड़कर और 'setParameter' अब कम से कम हाइबरनेट साथ काम करता है।

String jpql = "from A where name in :names"; 
Query q = em.createQuery(jpql); 
q.setParameter("names", l); 
संबंधित मुद्दे