Używasz nazw klas i pól w HQL, a nazw tabel i kolumn w SQL. Nie powinieneś więc widzieć podkreśleń (przynajmniej nie wiele) w zapytaniach HQL. Również, jest mało prawdopodobne, aby był tutaj czynnikiem, ale zapytania HQL są uruchamiane z findAll
a te są uruchamiane z executeQuery
może być nieco inny. Nie pamiętam jaka jest różnica, ale executeQuery
jest poprawny bez względu na klasę domeny.
Trudno to stwierdzić bez oglądania klas domeny, ale wygląda na to, że artifact_id
powinno być artifact.id
i document_id
powinno być document.id
. A ponieważ masz instancję Document, bardziej właściwe jest porównywanie obiektów, a nie ich identyfikatorów. Wreszcie zakładam, że active
jest właściwością logiczną, więc potrzebuje wartości logicznej, a nie 1 lub 0. Więc, łącząc to wszystko razem, najlepiej przypuszczam, że tego właśnie chcesz:
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])
Pamiętaj, że musisz oddzielić wartości param od kontrolek paginacji na dwie mapy.