Pregunta

Estoy trabajando en un proyecto de Grails usando Hibernate (GORM). Tengo los siguientes modelos de dominio:

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

Person {
   static hasMany = [clientContacts: ClientContact]
}

Cuando intento recuperar todos los ClientContacts con un propietario específico ( Person ), me encuentro con algunos problemas divertidos. Estoy usando los siguientes criterios de consulta:

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

El problema es cuando recorro cada uno de mis ClientContacts en los resultados, solo tienen el único propietario , cuando en realidad, la mayoría tiene muchos otros propietarios. ¿Lo que da? Sé que Hibernate / GORM utiliza la recuperación perezosa, pero pensé que iba a buscar a todos los demás propietarios en un ClientContact cuando intenté acceder a ellos.

¿Algún pensamiento? Me gustaría continuar usando la función list () ya que proporciona algunas funciones de paginación agradables.

¿Fue útil?

Solución

Sé que este hilo es muy antiguo, pero acabo de encontrar exactamente el mismo problema hoy en día y la solución parece ser el uso de alias, así que en su lugar:

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

uno puede probar:

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

La primera consulta crea uniones externas a la izquierda y la segunda crea uniones internas. Consulte este enlace para obtener una descripción más detallada: http: // adhockery. blogspot.com/2009/06/querying-by-association-redux.html

Otros consejos

Dos observaciones rápidas:

  1. La [Documentación de Grails] ( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.2.1.3 Many-to- muchos) dice que una asociación muchos-a-muchos tiene que ser codificada manualmente, el andamio predeterminado no lo hará.
  2. Es posible que deba usar el criterio eqId () ; consulte createCriteria

id y version son propiedades especiales de todas las clases GORM. No es necesario que los especifique en la declaración de clase, y no puede usar el criterio estándar con ellos.

Definitivamente necesitas usar el criterio eqID

   def query = {
          owners {
                eqId(Long.parseLong(params.ownerId))
          }
   }
   def criteria = ClientContact.createCriteria()
   def results = criteria.list(params, query)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top