2016-04-26 5 views
0

Ich habe eine Spalte in meiner Datenbank, die diese Werte "Bob; Steve; Fred" haben. Diese Spalte ist eine Zeichenfolge (keine Liste), und ich möchte in der Lage sein, eine Abfrage zu erstellen, die mir den Wert gibt, den ich durch die Parameter übergebe.Wie erhält man nur einen Wert eines Strings, der einige Werte in Grails gesetzt hat und keine Liste ist?

Dies ist meine Domain:

String name (values that contain name is: Bob;Steve;Fred) 

, dass ich versuche, eine Abfrage zu tun ist, zu bauen, die den Namen bekommen mir nur, dass ich in der Methode übergeben:

Dies ist mein Verfahren und dass ich versuche zu tun:

def updateName(String myName) { 
    MyDomain md = MyDomain.findByName(myName) 
    if (!md) { 
     log.warn "name not found [" + name+ "]" 
    } 

} 

Damit erhalte ich immer md = null;

Das möchte ich zum Beispiel. Wenn ich myName pass = Bob, dass ich will, ist Bob in meinem String Namen finden, die drei Namen haben (Bob, Steve, Fred):

MyDomain md = MyDomain.findByName(Bob) 
md should be = Bob 

Vielen Dank im Voraus

+0

ich verstehe das Problem nicht vollständig, aber es sollte 'findByName', nicht' findByname' –

+0

auch sein. Was dieser _String-Name (Werte, die den Namen enthalten: Bob; Steve; Fred) _ bedeutet? Geben Sie genaue Beispiele für übergebene Werte und Domänenwerte an und was Sie erreichen möchten –

+0

Hi @Mikelis. Ich habe meine Frage aktualisiert. Bitte schau es dir an. Aber im Grunde, dass ich will, ist der Name, den ich im arg übergeben, passen Sie mit meinem String-Speicher in der Datenbank und geben Sie den Wert –

Antwort

0

INTRO
Zwar gibt es eine Antwort für bestehendes Problem ist, wie @tim_yates wies darauf hin, gibt es mögliche Probleme mit der Verwendung meiner Antwort sowie Ihren Ansatzes, um die Domain-Klasse der Einstellung ist nicht die beste

Wie Liste setzt in Domäne
Grails Domain-Klassen hat hasMany selector, so dass Ihre Domain-Klasse sollte wie folgt aussehen:

class MyDomain { 
    static hasMany = [names: String] 
    List names 
} 

so fügen Sie einen Namen
Wenn ein Domain-Objekt hat und einen anderen Namen zu der Liste hinzufügen wollen, können Sie myDomainObject.addToNames(thename) verwenden

Wie namentlich abrufen
Wie ich bereits erwähnt, erfordert dies createCriteria():

def results = MyDomain.createCriteria().list{ 
    "in"("names",someName) 
} 

Diese gibt eine Liste aller Domänenobjekte zurück.Wenn Sie einige Daten von ihnen erhalten möchten, können Sie eine Schleife durch each verwenden und auf einen Artikel verweisen it mit:

results.each{ 
    println it.names 
} 
1

Diese Standardfunktionen wie findBySomething() Arbeit nur mit genaue Werte. Weil sie in Hibernate-Abfragen übersetzt werden und in der Abfrage, die überprüft wird, ist der Wert des Objekts gleich dem übergebenen Wert.
Aber Grails hat ein Ding namens criteria und wenn ich das richtig verstehe (die Sie Domain-Wert möchten, dass Ihre übergebenen String ENTHALTEN), sollten Sie so gehen:

def results = MyDomain.createCriteria().list{ 
    ilike("name", "%"+myName+"%") 
} 


AUCH
Ich verstehe nicht, was Sie erreichen wollen, aber diese Struktur scheint nicht gut zu sein (um mögliche Werte in einer solchen Zeichenfolge zu speichern)

+0

Dank Mikelis, Sorry, ich denke, dass dies funktionieren könnte, aber ich bekomme ein Objekt in Ergebnissen nicht der Name wie eine Zeichenfolge, die ich versuche zu entsprechen –

+1

Das oben genannte würde auch falsch positive finden, wo 'name = 'timus; kate; bobina'' –

+0

@tim_yates hatte ich das auch in meinem Kopf. –