2012-12-19 10 views
8

मैं एक जेपीक्यूएल क्वेरी लिखने की कोशिश कर रहा हूं जो सभी PlaylistItem को हटा देगा-ArtContent-0 द्वारा ArtContent आईडी को प्रतिबिंबित करता है।हाइबरनेट में अपने बच्चे के आइटम के आईडी-एस द्वारा आइटम कैसे हटाएं?

मैं इस कोशिश की:

public int deleteItemsByContentIds(Long[] contentIds) { 
    EntityManager em = getEntityManager(); 
    int result = em.createQuery(
    "delete from PlaylistItem where artContent.id in (:idsArray) ") 
    .setParameter("idsArray", contentIds).executeUpdate(); 

    return result; 
} 

लेकिन यह एक अपवाद फेंकता है:

Servlet.service() for servlet RemoveContentServlet threw exception: 
javax.ejb.EJBException: java.lang.IllegalArgumentException: 
Encountered array-valued parameter binding, but was expecting [java.lang.Long] 

क्या, समझा जा सकता है क्योंकि वहाँ एक तर्क के रूप एक सरणी ले जा नहीं setParameter विधि। तो इस तरह के किसी मुद्दे को हल करने का सबसे अच्छा तरीका क्या है?

सरलीकृत वर्ग परिभाषा:

@Entity 
public class PlaylistItem implements Serializable { 

@Id 
@GeneratedValue 
private Long id; 

private int position; 

@ManyToOne(optional = false) 
@JoinColumn(name = "PLAYLIST_ID") 
private Playlist playlist; 

@ManyToOne(optional = false) 
@JoinColumn(name = "ART_CONTENT_ID") 
private ArtContent artContent; 

... 

}

@Entity 
public class ArtContent implements Serializable { 

@Id 
@GeneratedValue 
private Long id; 
... 
} 

उत्तर

7

आप .setParameter का उपयोग जारी रख सकते हैं लेकिन आपको एक सरणी प्रकार का उपयोग करने के बजाय मूल्य को संग्रह (जैसे एक ArrayList) का विस्तार करने की आवश्यकता है। शायद बस इसमें बदलें:

public int deleteItemsByContentIds(Long[] contentIds) { 
    EntityManager em = getEntityManager(); 
    int result = em.createQuery(
    "delete from PlaylistItem where artContent.id in (:idsArray) ") 
    .setParameter("idsArray", Arrays.asList(contentIds)).executeUpdate(); 

    return result; 
} 
+0

यही वह है! आपका बहुत बहुत धन्यवाद! – Anke

+0

मेरे लिए भी ठीक काम करता है, धन्यवाद! – kospol

1

बजाय प्रयास करें setParameterList

संपादित करें:

क्षमा करें, जेपीए एक संग्रह (Arrays.asList(arrayOfLongs)) करने के लिए इसे बदलने और बस setParameter का उपयोग करने के लिए।

संपादित करें 2: पंच को मारो!

+0

धन्यवाद, लेकिन setParameterList org.hibernate.Query की एक विधि है और यहां मेरे पास javax.persistence.Query है। – Anke

+0

हां, संग्रह ने काम किया :) – Anke

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