Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-zu-HQL-Abfrage Grails

Sie verwenden Klassen- und Feldnamen in HQL und Tabellen- und Spaltennamen in SQL. Daher sollten Sie in HQL-Abfragen keine Unterstriche (zumindest nicht viele) sehen. Es ist auch unwahrscheinlich, dass dies hier ein Faktor ist, aber HQL-Abfragen werden von findAll ausgeführt und diese laufen von executeQuery kann etwas anders sein. Ich kann mich nicht erinnern, was der Unterschied ist, aber executeQuery ist die richtige, egal um welche Domänenklasse es sich handelt.

Es ist schwer zu wissen, ohne die Domänenklassen zu sehen, aber es scheint wie artifact_id sollte artifact.id sein und document_id sollte document.id sein . Und da Sie die Document-Instanz haben, ist es besser, die Objekte und nicht ihre IDs zu vergleichen. Schließlich gehe ich davon aus, dass active ist eine boolesche Eigenschaft, also braucht sie einen booleschen Wert und keine 1 oder 0. Wenn ich das alles zusammenfasse, ist meine beste Vermutung, dass Sie Folgendes wollen:

def artifacts = Artifact.executeQuery(
   "FROM Artifact WHERE id NOT IN ( " +
   "SELECT artifact.id FROM Classification " +
   "WHERE active = :active) AND document =:doc",
   [active: true, doc:document],
   [max:limit, offset:startIndex])

Beachten Sie, dass Sie Parameterwerte von Paginierungssteuerungen in zwei Karten trennen müssen.