2012-12-19 2 views
8

ArtContent -s를 ArtContent ID로 참조하는 모든 PlaylistItem -s를 삭제하는 JPQL 쿼리를 작성하려고합니다. Hibernate에서 하위 항목의 ID-S로 항목을 삭제하는 방법은 무엇입니까?

나는이 시도 :

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

을하지만 예외가 발생합니다 :

인수로 배열을 가지고 더 setParameter 방법이 없기 때문에, 이해가 무엇
Servlet.service() for servlet RemoveContentServlet threw exception: 
javax.ejb.EJBException: java.lang.IllegalArgumentException: 
Encountered array-valued parameter binding, but was expecting [java.lang.Long] 

. 그런 문제를 해결하는 가장 좋은 방법은 무엇입니까?

간체 클래스 정의 :

@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을 사용할 수 있지만 배열 유형을 사용하는 대신 값을 Collection (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을보십시오.

편집 :

죄송합니다, JPA는 컬렉션 (Arrays.asList(arrayOfLongs))로 변환 그냥 setParameter을 사용하십시오.

편집 2 : 펀치에 맞습니다!

+0

고맙지 만 setParameterList는 org.hibernate.Query의 메소드이고 여기에 javax.persistence.Query가 있습니다. – Anke

+0

예, 컬렉션이 작업을 수행했습니다. – Anke

관련 문제