Du använder klass- och fältnamn i HQL och tabell- och kolumnnamn i SQL. Så du bör inte se understreck (åtminstone inte många) i HQL-frågor. Dessutom är det osannolikt att det är en faktor här, men HQL-frågor körs från findAll
och de körs från executeQuery
kan vara lite annorlunda. Jag kommer inte ihåg vad skillnaden är, men executeQuery
är den korrekta oavsett vilken domänklass som är inblandad.
Det är svårt att veta utan att se domänklasserna, men det verkar som artifact_id
ska vara artifact.id
och document_id
ska vara document.id
. Och eftersom du har Document-instansen är det mer O-O-riktigt att jämföra objekten och inte deras ID. Slutligen antar jag att active
är en boolesk egenskap, så den behöver ett booleskt värde och inte en 1 eller 0. Så, sammanställt allt detta, är min bästa gissning att det här är vad du vill ha:
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])
Observera att du måste separera paramvärden från sideringskontroller i två kartor.