Criteri di ibernazione: recupero di un singolo oggetto
Domanda
Sto lavorando a un progetto Grails usando Hibernate (GORM). Ho i seguenti modelli di dominio:
ClientContact {
static hasMany = [owners: Person]
static belongsTo = [Person]
}
Person {
static hasMany = [clientContacts: ClientContact]
}
Quando provo a recuperare tutti i ClientContacts
con un proprietario specifico ( Person
), mi imbatto in alcuni problemi divertenti. Sto utilizzando i seguenti criteri di query:
def query = {
owners {
eq("id", Long.parseLong(params.ownerId))
}
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query)
Il problema è che quando eseguo l'iterazione di ciascuno dei miei ClientContacts
nei risultati, hanno solo l'unico proprietario - quando in realtà, molti hanno molti altri proprietari. Cosa dà? So che ibernazione / GORM utilizza il recupero lento, ma ho pensato che avrebbe recuperato tutti gli altri proprietari su un ClientContact
quando ho provato ad accedervi.
Qualche pensiero? Vorrei continuare a utilizzare la funzione list () poiché offre alcune funzioni di paging interessanti.
Soluzione
So che questo thread è molto vecchio, ma oggi ho riscontrato esattamente lo stesso problema e la soluzione sembra essere l'utilizzo di alias, quindi invece:
def query = {
owners {
eq("id", Long.parseLong(params.ownerId))
}
}
si può provare:
def query = {
createAlias("owners", "o")
eq("o.id", Long.parseLong(params.ownerId))
}
La prima query crea join esterni a sinistra e la seconda crea join interni. Vedi questo link per una descrizione più dettagliata: http: // adhockery. blogspot.com/2009/06/querying-by-association-redux.html
Altri suggerimenti
Due osservazioni rapide:
- The [Grails Documentation] ( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.2.1.3 Many-to- molti) afferma che un'associazione molti-a-molti deve essere codificata manualmente, l'impalcatura predefinita non lo farà.
- Potrebbe essere necessario utilizzare il criterio
eqId ()
- consultare createCriteria
id e versione sono proprietà speciali di tutte le classi GORM. Non è necessario specificarli nella dichiarazione di classe e non è possibile utilizzare il criterio standard con essi.
Devi assolutamente utilizzare il criterio eqID
def query = {
owners {
eqId(Long.parseLong(params.ownerId))
}
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query)