2010-05-18 15 views
4

je tente de supprimer une liste de lignes d'une table en utilisant ce natif de requête:JPA native requête de suppression dans

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

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

et cela est le SQL que MySQL exécute:

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

SO, JPA ne remplace pas la variable IDsList ...

Quelqu'un pourrait m'aider s'il vous plaît?

+0

Je ne suis pas sûr si une Collection est supposée être développée dans une requête ** native **. –

Répondre

2

Une façon qui fonctionne est si vous n'utilisez pas l'identifiant comme vous avez essayé, mais au lieu d'utiliser l'entité et laissez JPA gérer l'identification de celui-ci comme ceci:

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

espère que cela vous aide à droite direction.

4

Les requêtes natives ne prennent pas en charge l'expansion de collection ni les paramètres nommés.

vous devez écrire:

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

mais il est terrible

sur EclipseLink + mysql celui-ci fonctionne:

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

mais il est pas très agréable ... mais il n'y a pas d'autre solution utilisant une requête nommée.