2012-12-19 12 views
8

Sto provando a scrivere una query JPQL che cancelli tutti gli PlaylistItem -s riferendosi allo specifico ArtContent -s per gli ID ArtContent.Come eliminare gli elementi per ID dell'elemento figlio in Sospensione?

ho provato questo:

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; 
} 

ma viene generata un'eccezione:

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

cosa è comprensibile, perché non esiste un metodo setParameter prendendo una matrice come un argomento. Quindi qual è il modo migliore per risolvere questo problema?

semplificato definizione di classe:

@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; 
... 
} 

risposta

7

È possibile continuare a utilizzare .setParameter ma è necessario rendere il valore estendere una raccolta (come un ArrayList) anziché utilizzare un tipo di matrice. Forse basta cambiare a:

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

Ecco fatto! Molte grazie! – Anke

+0

Funziona bene anche per me, grazie! – kospol

1

Prova setParameterList invece.

Edit:

Siamo spiacenti, per APP convertirlo in una raccolta (Arrays.asList(arrayOfLongs)) e basta usare setParameter.

Edit 2: Picchiato al punzone!

+0

Grazie, ma setParameterList è un metodo di org.hibernate.Query e qui ho javax.persistence.Query. – Anke

+0

Sì, la Collezione ha fatto il lavoro :) – Anke

Problemi correlati