8

PlaylistItemIDで特定のArtContent-s を参照するすべての -s を削除する JPQL クエリを作成しようとしています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;
...
}
4

2 に答える 2

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;
}
于 2012-12-19T15:06:01.483 に答える
1

setParameterList代わりに試してください。

編集:

申し訳ありませんが、JPA の場合は Collection( Arrays.asList(arrayOfLongs)) に変換して、 を使用してsetParameterください。

編集2:殴られた!

于 2012-12-19T15:00:56.740 に答える