2010-05-18 101 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(); 

但它是不是很漂亮? 但是沒有任何其他使用命名查詢的解決方案。