2016-04-26 9 views
3

Ich versuche, so etwas wie dies in Grails HQL zu tun, aber es funktioniert nichtGrails executeUpdate mit Grenzwerte funktioniert nicht zum Löschen

ich aus der Liste der IDs up-to 5 Elemente entfernen möge die könnte 10 Elemente enthalten. Ich bestelle sie nach Datum und löschen nur die älteste 5

Entity.executeUpdate(
     "DELETE FROM Entity WHERE id in (:list) ORDER BY date LIMIT 5", 
     [list: oldestIdsForRemoval]) 

reine SQL funktioniert gut

DELETE FROM entity WHERE id in ('8f027db299354a869af51e1f0a60ede1', '96df61161c32491f8aa4a14c5017852c', '88aa7b2bb6e1444f8d892fff10b8adcd') ORDER BY date ASC LIMIT 1 

Ist das überhaupt möglich? Ich habe versucht, auch max:5 Parameter zur Liste der Parameter hinzuzufügen, aber es schlägt fehl.

Ich benutze Grails 1.3.6. Wenn es in neueren Versionen behoben wird, wäre es gut zu wissen, obwohl ich es nicht benutzen kann. Die Dokumentation hilft nicht viel in dieser Hinsicht: http://grails.github.io/grails-doc/1.3.7/ref/Domain%20Classes/executeUpdate.html

Antwort

1

Wenn Sie mit HQL arbeiten, sollten Sie das Hibernate Benutzerhandbuch verwenden. Es enthält einen Abschnitt über HQL, der die Sprache ziemlich gut abdeckt. Hier ist das Stammverzeichnis: https://docs.jboss.org/hibernate/orm/

Eine andere Quelle, obwohl ein kryptischer einen ist die ANTLR Quelle für den Parser verwendet HQL Code zu analysieren: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/antlr/hql.g

Aus dem ANTLR Code, den Sie zu dem Schluss kommen kann , wie ich es tat, dass HQL LIMIT nicht unterstützt. Dies ist der Fall, Sie haben ein paar Optionen:

  1. Verwenden Sie zwei Abfragen. A SELECT, zusammen mit einem max, um die IDs auszuwählen, und dann ein DELETE für diese spezifischen IDs.
  2. Verwenden Sie stattdessen eine systemeigene Abfrage (z. B. SQL), um vollständigen Zugriff auf die zugrunde liegende Datenbank zu erhalten.