Frage

Hallo Leute ich einige Probleme mit exakten Matches habe, während ein NamedQuery tun.

Ich bin derzeit so etwas wie dies mit:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME )

...

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName());

Es ist für die meisten Fälle funktioniert, jedoch bemerkte ich, für den Fall, dass der Benutzer am Ende des Dateinamen mit einem Raum passieren, ignoriert der namedQuery diesen Charakter. Zum Beispiel:

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName()+ " ");

Wird das gleiche Ergebnis wie die Abfrage zurückgeben vor. Umgehen meiner ‚gültige Eintrag‘ Validierung. Mit anderen Worten würde ich die Abfrage wie keinen Eintrag überhaupt zurückzukehren und die Fehler zu behandeln später.

Eine Abhilfe, die ich denken konnte, ist Apostrophe umgibt meine Parameter in der namedQuery, so zu setzen:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'")

Allerdings wird es meinen Code in Fall trash der String enthält einfache Anführungszeichen in ihm ...

Alle Ideen, Jungs?

War es hilfreich?

Lösung 2

habe ich einige der Forschung in JPA und fand heraus, dass es hat einige automatische Trimmung für verkohlt, ich bin nicht sicher, ob dies verhält sich das gleiche mit Strings, aber da es mir passiert ... Ich glaube schon. Der einzige Weg, zu umgehen ist es durch einige Attribute innerhalb der Sitzung DatabaseLogin Objekts einstellen (siehe http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/DatabaseLogin.html#setShouldTrimStrings ).

Nun, ich wollte nicht mit den Sitzungseigenschaften vermasselt werden, so entschied ich mich, eine Art Scheck zu machen und die gleiche Ausnahme zu werfen, wie die NoResultException fangen in meinem Code der Fall ist.

Ich habe im Grunde das Ergebnis aus der Datenbank und verglichen das Feld mit dem String I verwendet:

query.setParameter(Entry.NAME, myEntry.getName());

...

if(!StringUtils.equals(result.getName(), myEntry.getName()){
   do a cool throw just like NoResultException Catch
}

Ich musste auch die Trim-Funktion axtavt enthalten! Dies ist nur um sicher zu machen, dass, wenn die Datenbank eine Spalte mit Leerzeichen am Ende hat und es entspricht den Parameter durch den Benutzer gegeben, wird es als eine gültige Antwort enthalten sein. Zum Beispiel:

Datenbankeintrag. Name = "Flavio" - getrimmte mit Funktion = "Flavio"

Parameter übergeben:. Name = "Flavio" - getrimmte von JPA automatischer Funktion = "Flavio"

Wenn es überhaupt beschnitten isnt wird es nur vergleichen „Flavio“ mit „Flavio“, welcher noresult wenn es angeblich, dass Eintrag zurückzukehren.

Nasty Problem zu umgehen, aber solange es keine andere Möglichkeit besteht darin, die Auto-Trimmen zu stoppen wir nur nutzt diese Art von Dingen haben.

Danke für all die anderen Antworten !!

Andere Tipps

Ich denke, dies geschieht, weil Ihr Datenbankfeld als CHAR(...) deklariert wird, und deshalb werden gespeicherte Werte mit Leerzeichen aufgefüllt, die in nicht getroffen wird Konto durch = Betrieb.

So können Sie entweder Ihre Datenbankfeld als VARCHAR(...) deklarieren oder verwenden eine eingebaute in trim Funktion:

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top