Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête SQL vers HQL Grails

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.