2016-12-22 2 views
0

Bonjour, je suis nouveau sur javax.persistance. Le principal problème est que je veux supprimer les anciens (pas les derniers 10000) enregistrements dans ma base de données (classés par date desc). Je ne suis pas capable de faire une sous-requête dans mon instruction sql que j'attendrais habituellement:Supprimer avec sous-requête pour le filtre "in"

La journalisation est un objet (log) avec quelques informations et le champ occuredAt est la date (date + heure) où il a été écrit dans le base de données

base de données: db2 s'il est important

SQL:

DELETE FROM Logging WHERE id NOT IN (SELECT id FROM Logging ORDER BY occuredAt DESC LIMIT 10000) 

Et voici mon code que je suis en train d'exécuter.

EntityManager em = getEntityManager(); 
String sql = String.format("DELETE FROM %1$s WHERE id NOT IN (SELECT id FROM %1$s ORDER BY occuredAt DESC LIMIT %2$s)",Logging.class.getName(), 10000);     
Query qry = em.createQuery(sql); 
return qry.executeUpdate(); 

Mais cela me lance une ArgumentException.

Quelqu'un peut-il me dire ce que je fais mal?

+0

Jetez un oeil à ce sujet. On dirait que vous ne pouvez pas utiliser la limite dans une sous-requête avec hql. http://stackoverflow.com/questions/2738880/how-to-set-a-limit-to-inner-query-in-hibernate –

+0

Les requêtes JPA sont exprimées dans [Java Persistence Query Language (JPQL)] (http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html), pas SQL, et certainement pas dans le dialecte SQL spécifique de la base de données sous-jacente. JPQL et SQL sont intentionnellement similaires, mais pas identiques. Au minimum, votre requête est problématique car JPQL n'a pas de clause 'LIMIT'. –

+0

Cette syntaxe SQL DB2 n'est pas valide; ce que _is_ valide dépend de la version et de la plate-forme DB2. – mustaccio

Répondre

1

Vous ferez em.createNativeQuery pour SQL

em.createQuery est pour JP QL (Java Persistence Query Language), non pas pour SQL

0

modifier votre requête comme ceci

DELETE FROM Logging WHERE id NOT IN (SELECT id FROM Logging ORDER BY occuredAt DESC fetch first 10000 rows only)