2009-05-22 4 views
1

ich eine solche Domain-Klassen haben:Grails GORM Missing mit 1: N Beziehung

class ServicesGroup { 
    Long id 
    String name 
    String description 

    String toString(){ 
     return name 
    } 

    static mapping = { 
     version false 
     table 'root.services_groups' 

     id column:'group_id' 
     name column:'group_name' 
     description column:'group_desc' 
    } 
} 

und

class Step { 
    Long id 
    ServicesGroup service 
    String stepType 
    Integer stepFrom 
    Integer stepTo 

    static constraints = { 
     stepType(inList:['operator', 'client']) 
    } 

    static mapping = { 
     version false 
     table 'bill.steps' 
     service column:'service_group_id' 
    } 
} 

Die Beziehung ist - ein ServicesGroup Eintrag mehrere Step-Instanzen haben kann.

Wenn jedoch in meinem Controller versuche ich

Step.findByService(3) 

ich:

"org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: Step.findByService() is applicable for argument types: (java.lang.Integer) values: {3}" 

Allerdings, wenn ich Schritt Domain Klassenfeld ändern

ServicesGroup service 

einfach zu

Long service 

es funktioniert.

Was geht hier vor?

Antwort

3

Versuchen Sie es auf diese Weise:

Step.findByService(ServicesGroup.get(3)) 
+0

Das funktioniert! Kannst du mir ein paar Hinweise geben, warum? Etwas in den Zeilen von .. Service-Feld wird als ServicesGroup-Objekt deklariert, daher muss ich das Objekt des angegebenen Typs verwenden, wenn ich mit Service nach Sachen suchen möchte? Gibt es einen direkteren Weg zum gleichen Ergebnis ohne Verschachtelung findBy */get? Danke! – Karolis

+0

Siehe die andere Antwort unten. Ein dritter Weg wäre, die Hibernate-Kriterien zu verwenden und Step.withCriteria {service {eq ("id", 3)}} auszuführen. –

1

Versuchen

grails clean 
grails run-app 

Dann versuchen Sie es erneut.

+0

Nein, versuchte das. Trotzdem danke. – Karolis

+0

Muss in der nächsten Version behoben werden. Diese Lösung löst nicht nur viele Probleme. – Balaji

1

So etwas wie Step.findByService ([id: 3]) arbeiten kann. Es kümmert sich sowieso nur um die ID für die Zwecke der SQL-Generierung. In vielen Fällen wie diesem können Sie eine falsche Karte hineinwerfen und nicht nur die reale, und sparen Sie sich etwas Leistung.

Auf der anderen Seite, bricht die Abstraktion ein wenig, wenn Sie dies tun.