Verwenden Sie Reguläre Ausdrücke in JPA CriteriaBuilder
Bin ich mit dem PPV CriteriaBuilder zu wählen Entitäten des Typs MyEntity
aus einer MySQL-db wie folgt:
String regExp = "(abc|def)"
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery( MyEntity.class );
root = query.from( MyEntity.class );
predicates = new ArrayList<Predicate>();
predicates.add( cb.like( root.<String>get( "name" ), regExp ) );
So, das Ergebnis der Abfrage enthalten sollte jede Person, wo die name
Wert entspricht der angegebene regExp. Aber die Ergebnis-Liste ist immer leer.
Die änderung der regExp zu /(abc|def)/g
hat keine Wirkung, weder das hinzufügen der Platzhalter %
Machen, wie der pattern-matching arbeiten?
Alternativ: Wie kann ich native MySQL-REGEXP zusammen mit der CriteriaBuilder?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pattern matching in JPA-Abfragen beschränkt sich nur auf
_
- jeder Charakter%
- beliebige ZeichenfolgeREGEXP
hat operator-syntax in MySQL (SELECT 'a' REGEXP 'A'
), so kann es nicht verwendet werdenCriteriaBuilder.function()
API. Ich habe Angst, das beste ist das ausführen von nativen SQL-Abfrage.Wenn Sie mit Hibernate Sie haben noch eine weitere option. Sie können wrap
REGEXP
- operator inSQLFunctionTemplate
, erweitern hibernate-Dialekt und laufen mitCriteriaBuilder.function()
.Vielleicht dieses snippet hilft. Wir mussten ausschließen von Zeichen in einer Suche, und verwenden wir Oracle. CriteriaBuilder (zumindest ab 2.1) lassen Sie eine Funktion aufrufen.
In der search-Methode, erstellen Sie ein Prädikat in der where-Klausel:
Und erstellen Sie eine Methode für die Rechte hand comapare, dass die gleichen Werte, wie die Links:
Stieß ich auf dieses kürzlich und verwendet den ersten Beitrag zur Umsetzung der hibernate mysql-Funktion option.
Helfen, etwas Zeit sparen für andere das ist, was ich getan habe:
einrichten die Funktion in das benutzerdefinierte Dialekt Datei in Ruhezustand:
dann
innerhalb der Kriterien-generator-Abschnitt:
Dann verwenden theRegexPredicate, die zur Konstruktion der where-Klausel in Ihrem CriteriaBuilder Abfrage.