Frage

Ich arbeite an einem Projekt Grails mit Hibernate (GORM). Ich habe folgende Domain-Modelle:

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

Person {
   static hasMany = [clientContacts: ClientContact]
}

Wenn ich versuche, die ganze ClientContacts mit einem bestimmten Eigentümer (Person) abzurufen, ich laufe in einige lustige Fragen. Ich verwende die folgenden Abfragekriterien:

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

Das Problem ist, wenn ich durch jede meiner ClientContacts in den Ergebnissen durchlaufen, sie haben nur die einen Besitzer - wenn in der Tat, die meisten viele andere Eigentümer haben. Was gibt? Ich weiß überwintern / GORM faul fetching verwendet, aber ich dachte, es alle anderen Besitzer auf einem ClientContact holen würde, wenn ich versuchte, auf sie zuzugreifen.

Alle Gedanken? Ich möchte mit der list () Funktion fortzusetzen, da es bietet einige netten Paging-Funktionen.

War es hilfreich?

Lösung

Ich weiß, dass dieses Thema ist sehr alt, aber ich stoße gerade genau das gleiche Problem heute und die Lösung scheint Verwendung von Alias-Namen zu sein, also statt:

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

Man kann versuchen:

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

Die erste Abfrage erstellt linke Outer-Joins und die zweite schafft innere verbindet. Bitte beachten Sie diesen Link für weitere detaillierte Beschreibung: http: // adhockery. blogspot.com/2009/06/querying-by-association-redux.html

Andere Tipps

Zwei schnelle Beobachtungen:

  1. Die [Grails Dokumentation] ( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.2.1.3 Many-to viele) sagen, dass ein many-to-many Assoziation manuell codiert werden muss, wird das Standard-Gerüst es nicht tun.
  2. Sie müssen möglicherweise das eqId() Kriterium verwenden - siehe createCriteria

id und Version sind spezielle Eigenschaften aller GORM Klassen. Sie brauchen sie nicht in der Klassendeklaration angeben, und Sie können nicht das Standard-Kriterium mit ihnen verwendet werden.

Sie müssen auf jeden Fall das eqID Kriterium verwenden,

   def query = {
          owners {
                eqId(Long.parseLong(params.ownerId))
          }
   }
   def criteria = ClientContact.createCriteria()
   def results = criteria.list(params, query)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top