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.

È stato utile?

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:

  1. 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à.
  2. 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top