Vous utilisez des noms de classe et de champ en HQL, et des noms de table et de colonne en SQL. Vous ne devriez donc pas voir de traits de soulignement (du moins pas beaucoup) dans les requêtes HQL. De plus, il est peu probable que ce soit un facteur ici, mais les requêtes HQL s'exécutent à partir de findAll
et ceux exécutés à partir de executeQuery
peut être légèrement différent. Je ne me souviens pas quelle est la différence, mais executeQuery
est la bonne, quelle que soit la classe de domaine impliquée.
Il est difficile de savoir sans voir les classes de domaine, mais il semble que artifact_id
devrait être artifact.id
, et document_id
devrait être document.id
. Et puisque vous avez l'instance Document, il est plus approprié de comparer les objets et non leurs identifiants. Enfin, je suppose que active
est une propriété booléenne, elle a donc besoin d'une valeur booléenne et non d'un 1 ou d'un 0. Donc, en mettant tout cela ensemble, ma meilleure hypothèse est que c'est ce que vous voulez :
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])
Notez que vous devez séparer les valeurs de paramètre des contrôles de pagination dans deux cartes.