JPA Native Query删除

时间:2010-05-18 15:41:44

标签: jpa native delete-row

我尝试使用此Native Query从表中删除行列表:

@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)

SO,JPA不替换变量IDList ...

有人可以帮我吗?

2 个答案:

答案 0 :(得分: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();

然而它不是很好...... 但是没有使用命名查询的任何其他解决方案。

答案 1 :(得分: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();

希望它能帮助你朝着正确的方向前进。