Question

Je travaille sur un projet Grails avec Hibernate (GORM). J'ai les modèles de domaine suivants:

ClientContact {
   static hasMany = [owners: Person]
   static belongsTo = [Person]
}

Person {
   static hasMany = [clientContacts: ClientContact]
}

Lorsque j'essaie de récupérer tous les ClientsContacts avec un propriétaire spécifique ( Personne ), je rencontre des problèmes amusants. J'utilise les critères de requête suivants:

def query = {
   owners {
      eq("id", Long.parseLong(params.ownerId))
   }
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query) 

Le problème, c’est que lorsque je parcours chacun de mes ClientsContacts dans les résultats, ils n’ont que le propriétaire - alors que la plupart en ont beaucoup. Ce qui donne? Je sais que hibernate / GORM utilise la récupération paresseuse, mais je pensais que tous les autres propriétaires seraient récupérés sur un ClientContact lorsque je tentais d'y accéder.

Des pensées? Je souhaite continuer à utiliser la fonction list () car elle fournit quelques fonctionnalités de pagination intéressantes.

Était-ce utile?

La solution

Je sais que ce fil est très ancien, mais je viens de rencontrer exactement le même problème aujourd'hui et la solution semble être l'utilisation d'alias, donc à la place:

def query = {
        owners {
                eq("id", Long.parseLong(params.ownerId))
        }
}

on peut essayer:

def query = {
        createAlias("owners", "o")
        eq("o.id", Long.parseLong(params.ownerId))
}

La première requête crée des jointures externes gauche et la seconde crée des jointures internes. Veuillez consulter ce lien pour une description plus détaillée: http: // adhockery. blogspot.com/2009/06/querying-by-association-redux.html

Autres conseils

Deux observations rapides:

  1. La [Documentation Grails] ( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.2.1.3 Plusieurs-à- Beaucoup) indique qu'une association plusieurs à plusieurs doit être codée manuellement. L'échafaudage par défaut ne le fera pas.
  2. Vous devrez peut-être utiliser le critère eqId () - voir createCriteria

id et version sont des propriétés spéciales de toutes les classes GORM. Vous n'avez pas besoin de les spécifier dans la déclaration de classe et vous ne pouvez pas utiliser le critère standard avec elles.

Vous devez absolument utiliser le critère eqID

   def query = {
          owners {
                eqId(Long.parseLong(params.ownerId))
          }
   }
   def criteria = ClientContact.createCriteria()
   def results = criteria.list(params, query)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top