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

一种可行的方法是,如果您不像尝试过的那样使用 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 回答