2016-06-16 2 views
0

Édition 1: Pour clarifier davantage mon problème, j'ai mis à jour mon code d'exemple afin qu'une seule propriété soit pertinente.Grails Hibernate Critères: Comment spécifier plusieurs critères pour une association?

Dans la documentation de Grails, l'exemple suivant est donné in the Criteria section dans les associations d'interrogation:

Nous pouvons interroger [...] association [s] en utilisant les transactions de nom de la propriété en tant que nœud constructeur:

def c = Account.createCriteria() 
def now = new Date() 
def results = c.list { 
    transactions { 
     between('date', now - 10, now) 
    } 
} 

Le code ci-dessus trouver toutes les instances de compte qui ont effectué des transactions au cours des 10 derniers jours [...].

Tout cela est très bien, mais comment faire des requêtes plus complexes pour les associations? Je veux dire, pas chaque fois que je veux dire

requête tous les objets de domaine qui ont au moins un objet associé qui satisfait ma condition,

mais plutôt

requête tous les objets de domaine qui ont à au moins un objet associé qui satisfait ma condition ET qui a au moins un objet associé qui satisfait à une autre condition.

Voici les critères que j'ai essayé d'utiliser pour traiter ce dernier cas. Ça ne marche pas. Lorsque j'exécute ce code, seul l'un des critères d'association est pris en compte. Je pense qu'il n'est pas permis d'avoir plusieurs sous-requêtes pour la même association. Mais si c'est le cas, comment puis-je limiter cela davantage?

Le code suivant génère le résultat attendu, mais il n'est pas entièrement atteint au niveau de la base de données.

new DetachedCriteria(ParentDomainClass).build{ 
    associatedObjectsOfChildClass { 
     eq 'someProp', 'value' 
    } 
}.list().intersect(new DetachedCriteria(ParentDomainClass).build{ 
    associatedObjectsOfChildClass { 
     eq 'someProp', 'other_value' 
}}.list()) 

Voici une solution MySQL native:

select * from parent_object 
where id in(
    select parent_id from child_object 
    where some_prop = "value" 
) 
and id in (
    select parent_id from child_object 
    where some_prop = "other_value" 
) 

Comment puis-je obtenir que l'utilisation de critères seulement?

Répondre

1

Vérifiez les journaux de requête sql pour cela. Vous pouvez enregistrer la requête en ajoutant logSql = true dans dataSource.groovy ou définir cette propriété dans le fichier YML pour Grails 3.

Avez-vous essayé

Account.createCriteria().list{ 
    associatedObjectsOfChildClass { 
     eq 'someProp', 'value' 
     eq 'otherProp', 'otherValue' 
    } 
} 
+0

Je l'ai déjà activé la journalisation SQL. Cela ne m'aide pas vraiment car je ne sais pas quelle requête critères donne ma requête SQL souhaitée. S'il vous plaît vérifier mon commentaire sur [la réponse de Bhushan] (http://stackoverflow.com/a/37888901/3025256) pour pourquoi ce code que vous avez fourni n'aide pas dans mon cas. – nst1nctz