[Java] Spring/Hibernate @Query Annotation special character Suche

cppnap

Lt. Junior Grade
Registriert
Nov. 2008
Beiträge
487
Guten Tag,

ich habe hier ein Spring-Repository zur Fahrzeug-Verwaltung. Bei der Bezeichungssuche habe ich zum Beispiel Fahrzeug mit Sonderzeichen im Namen -> Ford hat zum Beispiel das Model KA+

Java:
    @Query("SELECT m FROM Model m JOIN FETCH m.brand WHERE m.label LIKE :label")
    Model findByLabel(@Param("label") String label);

Wenn ich jetzt im Frontend nach "KA" suche, dann findet er alle KA+ Fahrzeuge. Suche ich allerdings nach 'KA+' so findet er nix. Jetzt ist meine Frage wie ich die Methode anpasse, dass auch nach Sonderzeichen gesucht werden kann.

Vielen Dank :-)
 
@Andreas_ Da sagst du was! Das trifft aber auch nur in Ausnahmen zu.
Daher die Frage: Was für einen Typ hat deine "label" Spalte in der Datenbank? Und welche (und was für welche) Indizes wurden für diese Spalte angelegt?
 
@benneque
Ich kenne keine Datenbank, die in den Queries special characters erlaubt, ohne diese zu escapen. Das ist unabhängig vom Datentyp und existierenden Indizes.

Vielleicht gibt es ja mittlerweile Datenbanken, die das automatisieren. So eine ist mir aber bisher weder beruflich noch privat untergekommen.
 
@Andreas_ Ich hab das gerade mit meiner MySQL Datenbank hier ausprobiert. Eine Zeile mit "KA" und eine mit "KA+", sowohl mit "=" als auch mit "LIKE" kommt jeweils genau das Ergebnis raus, das ich gesucht habe, und nix anderes.

WHERE label = 'KA' liefert Zeile mit KA
WHERE label = 'KA+' liefert Zeile mit KA+
WHERE label LIKE 'KA' liefert Zeile mit KA
WHERE label LIKE 'KA+' liefert Zeile mit KA+
 
Also ich habe das mti dem Escapen ausprobiert und das funktioniert, vielen Dank.
Da gleich 2 Leute auf mich eingeprügelt haben, dass es meine Schuld sei, hab ich natürlich erstmal nur das Repo und die Log-Ausgabe beachtet.

Und jetzt im Network-Manager von Chrome festgestellt, dass der Client das + schon weg schneidet -.-
 
@Andreas_ Deswegen hielt ich das Escapen von Plus-Zeichen auch nicht für relevant, ist mir nämlich bisher noch nicht untergekommen. In Postgres dürfte es mit Plus-Zeichen auch keine Probleme geben.
Aber wir wissen ja auch nicht was hier für eine Datenbank benutzt wurde.

Aber ja, man kann natürlich einfach vorsorglich alles escapen, was einem zwischen die Finger kommt :D
 
Es geht um Java Hibernate. Ein Java Framework, welches eine eigene objektrelationale Abbildung erzeugt, unabhängig von der darunter liegenden Datenbank. Was man Escapen muss, richtet sich deshalb nach Java-Konventionen.

Um die Generierung der SQL-Statements kümmert sich Hibernate. Es kann Dir egal sein, was die darunter liegende Datenbank verlangt.
 
@Andreas_ Mir ist bewusst was Hibernate ist und kann und tut.

Insgesamt ist mir dann immer noch schleierhaft, warum du ein Plus Zeichen escapen willst.
Du sagst ja selbst, dass du keine DB kennst, die Special Chars in Querys erlaubt, ohne sie zu escapen. Aber du sagst auch, dass das Pluszeichen kein Special Char ist. Und darum ging es doch die ganze Zeit: Das Plus Zeichen. :confused_alt:

Es ist weder innerhalb von Java Strings, noch in den SQL Strings ein Sonderzeichen.
Und zusätzlich sollte durch Spring Data, Hibernate und Prepared Statements automatisch alle Sonderzeichen escaped werden, falls notwendig.
 
benneque schrieb:
Aber du sagst auch, dass das Pluszeichen kein Special Char ist.
Du solltest Dir eventuell noch einmal durchlesen, was ich geschrieben habe.

Bei der Frage des TE kam mir sofort der Gedanke zum Escapen, der ja anscheinend zielführend war. Mein letztes Projekt, bei dem Hibernate eingesetzt wurde, ist mehr als 10 Jahre her. Da gibt es bestimmt Leute, die sich besser auskennen.
 
Zurück
Oben