Critères Hibernate - objet unique récupéré
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.
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:
- 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.
- 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)