4

このネイティブクエリを使用して、テーブルから行のリストを削除しようとしています。

@NamedNativeQuery(name="WebGroup.DeleteIn",
query="DELETE FROM WebGroup WHERE
WebGroup.GROUP_ID IN (:IDsList)"

getEm().createNamedQuery("WebGroup.DeleteIn")
              .setParameter("IDsList", groupToDeleteIDs)
              .executeUpdate();

これは、MySQLが実行するSQLです。

DELETE FROM WebGroup WHERE WebGroup.GROUP_ID IN (:IDsList)

したがって、JPAは変数IDsListを置き換えません...

誰かが私を助けてくれますか?

4

2 に答える 2

4

ネイティブ クエリは、コレクションの拡張も名前付きパラメーターもサポートしていません。

あなたは書くべきです:

@NamedNativeQuery(name="WebGroup.DeleteIn", query="DELETE FROM WebGroup WHERE WebGroup.GROUP_ID IN (?,?,?,?)"

Query query = getEm().createNamedQuery("WebGroup.DeleteIn");
for(int i = 0; i < 4; i++) query.setParameter(i + 1, groupToDeleteIDs.get(i));
query.executeUpdate();

しかし、それは恐ろしいです

eclipselink + mysql では、これは機能します:

@NamedNativeQuery(name="WebGroup.DeleteIn", query="DELETE FROM WebGroup WHERE WebGroup.GROUP_ID IN (?)"

Query query = getEm().createNamedQuery("WebGroup.DeleteIn");
query.setParameter(1, StringUtils.join(groupToDeleteIDs, ",");
query.executeUpdate();

しかし、それはあまりいいことではありません...しかし、名前付きクエリを使用する他のソリューションはありません。

于 2013-01-17T09:03:33.450 に答える
3

機能する1つの方法は、試したようにid値を使用せず、代わりにエンティティを使用して、JPAに次のように識別を処理させることです。

HashSet<Transaction> transactions = new HashSet<Transaction>();
... 
entityManager.createQuery(
  "DELETE FROM Transaction e WHERE e IN (:transactions)").
  setParameter("transactions", new ArrayList<Transaction>(
  transactions)).executeUpdate();

正しい方向に役立つことを願っています。

于 2011-01-11T10:10:37.723 に答える