2010-04-25 12 views
3

Je vais avoir du mal à comprendre comment faire un « join » dans Groovy/Grails et les valeurs de retour je reçoisPourquoi cette requête Grails/HQL avec un retour JOIN Des listes de paires de classes de domaine?

person = User.get(user.id) 
def latestPhotosForUser = PhotoOwner.findAll(
    "FROM PhotoOwner AS a, PhotoStorage AS b WHERE (a.owner=:person AND a.photo = b)", 
    [person:person], [max:3]) 

latestPhotosForUser est pas une liste de PhotoOwners. C'est une liste de paires [PhotoOwner, PhotoStorage]. Puisque je fais un PhotoOwner.findAll, je m'attendrais à voir seulement PhotoOwners. Est-ce que je fais quelque chose de mal, ou est-ce le bon comportement?

Répondre

5

executeQuery et findAll sont un peu trompeuses car la classe sur laquelle vous les appelez n'a aucune incidence sur la requête ou son type de retour - GORM ajoute les méthodes à toutes les classes de domaine.

Compte tenu de la façon dont vous avez posé la question que je suppose que vous voulez

def latestPhotosForUser = PhotoOwner.executeQuery(
    "SELECT b FROM PhotoOwner a, PhotoStorage b WHERE a.owner=:person AND a.photo = b", 
    [person:person], [max:3]) 
+0

Ok! Je vois. Quand vous devez aller à HQL, les noms de fonctions dymaniques comme "findAll" n'ont aucune signification réelle et c'est juste une ExecuteQuery .... –

+2

Essentiellement, oui. Je n'ai jamais compris pourquoi il n'y a pas une classe statique "Domain" qui a ces fonctions au lieu de les placer sur toutes les classes de domaine. – billjamesdev

0

Je dirais que vous pouvez y parvenir par un chercheur dynamique, quelque chose comme ceci:

def latestPhotosForUser = PhotoOwner.findAllByOwner(person, [max:3]) 

Le vous peut juste creuser dans le dernier FotosForUser.photo afin d'arriver au stockage.