Mysql
 sql >> Database >  >> RDS >> Mysql

Query da SQL a HQL Grails

I nomi delle classi e dei campi vengono utilizzati in HQL e i nomi delle tabelle e delle colonne in SQL. Quindi non dovresti vedere i trattini bassi (almeno non molti) nelle query HQL. Inoltre, è improbabile che sia un fattore qui, ma le query HQL vengono eseguite da findAll e quelli eseguiti da executeQuery può essere leggermente diverso. Non riesco a ricordare quale sia la differenza, ma executeQuery è quello corretto, indipendentemente dalla classe di dominio coinvolta.

È difficile saperlo senza vedere le classi di dominio, ma sembra artifact_id dovrebbe essere artifact.id e document_id dovrebbe essere document.id . E poiché hai l'istanza Document, è più O-O-corretto confrontare gli oggetti e non i loro ID. Infine presumo che active è una proprietà booleana, quindi ha bisogno di un valore booleano e non di 1 o 0. Quindi, mettendo tutto insieme, la mia ipotesi migliore è che questo sia quello che vuoi:

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])

Nota che devi separare i valori dei parametri dai controlli di impaginazione in due mappe.