Criterios de hibernación - solo objeto recuperado
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.
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:
- 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á.
- 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)