Hibernate critérios - único objeto buscado
Pergunta
Eu estou trabalhando em um projeto usando Grails Hibernate (GORM). Eu tenho as seguintes Modelos de Domínio:
ClientContact {
static hasMany = [owners: Person]
static belongsTo = [Person]
}
Person {
static hasMany = [clientContacts: ClientContact]
}
Quando tento recuperar todas as ClientContacts
com um proprietário específico (Person
), eu estou correndo em algumas questões engraçadas. Eu estou usando os critérios seguinte consulta:
def query = {
owners {
eq("id", Long.parseLong(params.ownerId))
}
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query)
O problema é quando eu iterate através de cada um dos meus ClientContacts
nos resultados, eles só têm o proprietário - quando, na verdade, a maioria tem muitos outros proprietários. O que da? Eu sei hibernate / GORM usa busca preguiçosa, mas eu pensei que iria buscar todos os outros proprietários em um ClientContact
quando tentei acessá-los.
Todos os pensamentos? Eu gostaria de continuar usando o list () função, uma vez que fornece algumas características interessantes de paginação.
Solução
Eu sei que esta discussão é muito antiga, mas eu só encontrei exatamente o mesmo problema hoje e a solução parece ser o uso de apelidos, então em vez disso:
def query = {
owners {
eq("id", Long.parseLong(params.ownerId))
}
}
pode-se tentar:
def query = {
createAlias("owners", "o")
eq("o.id", Long.parseLong(params.ownerId))
}
A primeira consulta cria externa esquerda junta eo segundo cria junta interior. Por favor, veja este link para descrição mais detalhada: http: // adhockery. blogspot.com/2009/06/querying-by-association-redux.html
Outras dicas
Duas observações rápidas:
- O [Documentação Grails] ( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.2.1.3 Many-to- muitos) diz que um many-to-many associação tem de ser codificado manualmente, o andaime padrão não vai fazê-lo.
- Você pode precisar usar o critério
eqId()
- veja createCriteria
id e versão são propriedades especiais de todas as classes GORM. Você não precisa especificá-los na declaração da classe, e você não pode usar o critério padrão com eles.
Você definitivamente precisa usar o eqID critério
def query = {
owners {
eqId(Long.parseLong(params.ownerId))
}
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query)