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.

Foi útil?

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:

  1. 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.
  2. 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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top