Wie zu tun ist, wie groß- / Kleinschreibung und Akzent insensitiv in PostgreSQL und JPA 2?
Ich habe ein Java-EE-Projekt mithilfe von PostgreSQL 9.X und JPA2 (Hibernate-Implementierung).
Wie kann ich die Kraft einer like-Abfrage groß-und Kleinschreibung und keine Unterscheidung nach Akzent?
Ich bin in der Lage, ändern Sie den Zeichensatz der DB, weil es das erste Projekt mit ihm.
- Haben Sie versucht, ILIKE?
- Sie sind mit Kriterien Abfragen oder JPQL? Siehe auch diese Frage: stackoverflow.com/questions/4580285/...
- Siehe auch stackoverflow.com/questions/4218780/...
- Ich bin mit Kriterien Abfragen, aber ich kann verwenden, JPQL, wenn nötig. Ich kenne den trick mit der oberen, aber es ist immer Akzent...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen es gibt keine standard-Weg, um zu schreiben "accent-insensitive" - code, oder zu vergleichen, Wörter für Gleichberechtigung und ignorieren Akzente. Die ganze Idee macht sehr wenig Sinn, da verschiedene Zeichen mit Akzent bedeutet, dass verschiedene Dinge in verschiedenen Sprachen/Dialekten, und Ihre "plain ascii" - Substitutionen/- Erweiterungen variieren je nach Sprache. Bitte tun Sie das nicht;
resume
undrésumé
sind verschiedene Wörter, und die situation wird noch schlimmer, wenn man jede language(s) other than English.Für Fall-Gefühllosigkeit, die Sie verwenden können
lower(the_col) like lower('%match_expression')
in JPQL. Soweit ich weißilike
ist nicht unterstützt in JPQL, aber ich habe nicht geprüft der standard um dies zu überprüfen. Es ist gut lesbar, so betrachten nur den Download der JPA2 spec und Lesen es. JPA2 Kriterien bietetRestrictions.ilike
für den Zweck. Weder werden normalize/Streifen/ignorieren von Zeichen mit Akzent.Zum Abisolieren Akzente, etc, werden Sie wahrscheinlich benötigen, um zu verwenden Datenbank-engine bestimmte gespeicherte Funktionen oder native queries. Siehe, zB diese Vorherige Antwort, oder wenn Sie bestimmt zu Ersatz Zeichen mit Akzent mit einem unbetont alternative das PostgreSQL-wiki-Eintrag - aber wieder bitte tun Sie das nicht außer für sehr begrenzte Zwecke wie die Suche nach Orten, wo Worte vielleicht schon "unbetont" durch falsche software oder Benutzer.
Wenn die unaccent Erweiterung installiert ist:
Ich hatte dieses Problem, und ich konnte nicht mit Datenbank-Funktionen. So anstelle habe ich eine REGEX Einschränkung in meinem Kriterien-code:
Dann schrieb ich eine Funktion namens unaccent zu ändern Sie jedes Zeichen in eine oder-Anweisung, zum Beispiel jeden Buchstaben e wird (e|é|è). Eine Abfrage für "Hallo" wird zu "h(e|é|è)llo".
Hier ist die Funktion inspiriert von diesem thread Postgres Akzent unempfindlich WIE die Suche in Rails 3.1 auf Heroku
Normalizer.normalize(text, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "")
scheint es, dass es normalisiert ist ein text in der Java-code. Die Notwendigkeit hier ist zu normalisieren, ist es in PostgreSQL. Die unaccent-Funktion, die ich schrieb, drehen Sie diese Zeichenfolge"hello"
dieser"h(è|é|ê|ё|ë|ē|ĕ|ė|ę|ě|È|Ê|Ë|Ё|Ē|Ĕ|Ė|Ę|Ě|€)ll(ò|ó|ô|õ|ö|ō|ŏ|ő|ø|Ò|Ó|Ô|Õ|Ö|Ō|Ŏ|Ő|Ø|Œ)"