2010-05-18 98 views
4

我尝试使用这种原生查询表中删除行的列表:JPA原生查询删除

@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不会替换变量IDsList ...

有人可以帮助我吗?该工程

+0

我不确定集合是否应该在**原生**查询中进行扩展。 – 2010-05-18 16:14:23

回答

2

的一种方法是,如果你没有使用的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(); 

希望它可以帮助您在正确的方向。

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(); 

但它是不是很漂亮? 但是没有任何其他使用命名查询的解决方案。