Frage

In SQL kann man eine Abfrage schreiben, die für einen Namen einer Person wie folgt sucht:

SELECT * FROM Person P WHERE P.Name LIKE N'%ike%'

Diese Abfrage mit Unicode-Zeichen führen würde (unter der Annahme, dass der Spalt Namen und Datenbank-Setup war Unicode-Unterstützung zu handhaben).

Ich habe eine ähnliche Abfrage in HQL, die von Hibernate (NHibernate) ausgeführt wird. Die erzeugte Abfrage wie folgt aussieht:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%'  )

Leider ein ‚N‘ vor dem wörtlichen in dem HQL führt zu einem Fehler platzieren. Ich habe versucht, die Unicode-Zeichen in der Zeichenfolge zu entkommen und immer noch ohne Erfolg.

Die Datenbank akzeptiert und Speichern von Unicode-Zeichen aus dem Ruhezustand. Ich habe in der Lage, erfolgreich ein Objekt mit einem Unicode-String zu füllen, speichern Sie sie mit Hibernate, und überprüfen sie in der Datenbank. Es wäre als wenig seltsam scheint mich, dass ich nicht Unicode-Strings in benutzerdefinierten Abfragen verwenden kann (oder ich bin auch davon benannte Abfragen).

Ist das ein bekanntes Problem oder die Beschränkung von Hibernate (Nhibernate)? Wie verwenden Sie Unicode in HQL?

Mehrere Standorte schlagen die Kriterien Abfragen. Aufgrund von Einschränkungen im Rahmen, das ich arbeite in, dann ist dies nicht möglich.

War es hilfreich?

Lösung

Haben Sie mit den Parametern versucht:

IList<Person> people = session
    .CreateQuery("from Person p where p.Name like :name")
    .SetParameter("name", "%カタカ%")
    .List<Person>();

Sie haben auch den Vorteil, Ihre Abfrage gegen SQL-Injection zu schützen.

Andere Tipps

Ich fand eine Lösung, die funktioniert. Ich bezweifle es stark ist die beste Lösung. Es ist jedoch die Lösung, die ich werde implementieren, bis ich ein Umschreiben des gesamten Abfrage Bauabschnittes der Software genehmigen kann, die ich arbeite.

Im Beispiel:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%')

Die where-Klausel enthält diese wörtliche:

'%カタカ%'

Diese wörtliche aufgeteilt in nchars werden kann, die Hibernate (Nhibernate) an die SQL unwissentlich durch vergehen es generiert. Seltsam, aber es funktioniert. So ist die vorherige Abfrage geschrieben werden als:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%' + nchar(0x30AB) + nchar(0x30BF) + nchar(0x30AB)+ '%')

Diese Lösung ist bei weitem nicht optimal, weil es durch jedes Zeichen gehen würde erfordern, und zu bestimmen, ob es sich um ein Multibyte-Zeichen war. Doch in dem Fall, wo dieser Code lebt in seiner Anwendung ist es in einem dynamischen Abfrage-Generator verwendet, die mehr unterschiedlichen Kriterien unter verschiedenen Operationen verarbeitet. Im Beispiel gebe ich es für Unicode überall in der Zeichenfolge sucht. Es ist möglich, dass diese Funktion kann die where-Klausel Teil für eine Spalte zurückkehren einen bestimmten numerischen Wert gleich oder es könnte für den Start Zeichen einer Zeichenkette suchen. Die Methode, die der Bediener baut verwendet einen Operatortyp und der Begriff eine Zeichenfolge zurückzugeben. Ich könnte das neu schreiben, aber es wäre eine große Aufgabe sein. Die obige Fix wird mir erlauben, eine Zeichenfolge in diese Methode übergeben zu verarbeiten. Ich biete diese Lösung, weil es funktioniert, aber Darins Antwort ist wahrscheinlich der beste Weg, den ich finden konnte.

Dieses Problem tritt auf, weil NHibernate die Säule ohne die Art Länge zuzugreifen versucht. Daher wird in der hbm.xml seine sehr wichtig für Legacy zu erwähnen Länge Datenbanken sonst wird es für UNICODE-bezogenes scheitern.

Danke, Thani

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top