Bạn sử dụng tên lớp và trường trong HQL cũng như tên bảng và cột trong SQL. Vì vậy, bạn sẽ không thấy dấu gạch dưới (ít nhất là không nhiều) trong các truy vấn HQL. Ngoài ra, nó không chắc là một yếu tố ở đây, nhưng các truy vấn HQL chạy từ findAll
và những thứ đó chạy từ executeQuery
có thể hơi khác. Tôi không thể nhớ sự khác biệt là gì, nhưng executeQuery
là chính xác cho dù có liên quan đến lớp miền nào.
Thật khó để biết nếu không nhìn thấy các lớp miền, nhưng có vẻ như artifact_id
phải là artifact.id
và document_id
phải là document.id
. Và vì bạn có cá thể Document, nên việc so sánh các đối tượng chứ không phải id của chúng sẽ phù hợp hơn. Cuối cùng, tôi giả định rằng active
là một thuộc tính boolean, vì vậy nó cần một giá trị boolean chứ không phải 1 hoặc 0. Vì vậy, kết hợp tất cả những điều này lại với nhau, tôi đoán tốt nhất rằng đây là những gì bạn muốn:
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])
Lưu ý rằng bạn cần tách các giá trị tham số khỏi các điều khiển phân trang thành hai bản đồ.