Anda menggunakan nama kelas dan bidang di HQL, dan nama tabel dan kolom di SQL. Jadi, Anda seharusnya tidak melihat garis bawah (setidaknya tidak banyak) dalam kueri HQL. Juga, itu tidak mungkin menjadi faktor di sini, tetapi kueri HQL dijalankan dari findAll
dan yang dijalankan dari executeQuery
bisa sedikit berbeda. Saya tidak ingat apa perbedaannya, tetapi executeQuery
adalah yang benar tidak peduli kelas domain mana yang terlibat.
Sulit untuk mengetahui tanpa melihat kelas domain, tetapi sepertinya artifact_id
harus artifact.id
, dan document_id
harus document.id
. Dan karena Anda memiliki instance Dokumen, lebih tepat untuk membandingkan objek dan bukan idnya. Akhirnya saya berasumsi bahwa active
adalah properti boolean, jadi ini membutuhkan nilai boolean dan bukan 1 atau 0. Jadi, jika digabungkan, tebakan terbaik saya adalah ini yang Anda inginkan:
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])
Perhatikan bahwa Anda perlu memisahkan nilai param dari kontrol pagination menjadi dua peta.