4 Stimmen

JPQL LIKE-Ausdruck auf Enum

Kann JPQL LIKE-Ausdrücke gegen Enums ausführen?

Wenn ich eine Entität Foo mit einem Enum-Feld bar habe, kann ich Folgendes in MySQL ausführen (bar wird als MySQL-Enum gespeichert)...

SELECT * FROM Foo WHERE `bar` LIKE '%SUFFIX'

Die entsprechende Abfrage in JPQL jedoch...

SELECT f FROM Foo f WHERE f.bar LIKE '%SUFFIX'

...beschwert sich, dass...

Der Parameterwert [%SUFFIX] nicht mit dem Typ [com.example.Foo$EnumType] übereinstimmte

7voto

Pascal Thivent Punkte 548176

Ich denke nicht, dass es möglich ist, der linke Teil eines LIKE soll ein string_expression sein (im Standard JPA). Aus der Spezifikation:

4.6.9 Like-Ausdrücke

Die Syntax für die Verwendung des Vergleichsoperators [NOT] LIKE in einem bedingten Ausdruck lautet wie folgt:

string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]

Der string_expression muss einen Zeichenkettenwert haben. Der pattern_value ist ein Zeichenkettenliteral oder ein zeichenkettenwertiger Eingabeparameter, in dem ein Unterstrich (_) für ein einzelnes Zeichen steht, ein Prozentzeichen (%) für eine beliebige Zeichenfolge (einschließlich der leeren Zeichenfolge) und alle anderen Zeichen für sich selbst. Der optionale escape_character ist ein Zeichenkettenliteral mit einem einzelnen Zeichen oder ein zeichenwertiger Eingabeparameter (d. h. char oder Character) und wird verwendet, um die besondere Bedeutung der Unterstrich- und Prozentzeichen im pattern_value zu escapen.

Und ein enum_expression ist kein string_expression.

Das Folgende würde jedoch funktionieren (mit Verwendung von enum literals):

SELECT f 
  FROM Foo f 
 WHERE f.bar = com.acme.Bar.SOME_CONSTANT 
    OR f.bar = com.acme.Bar.SOME_OTHER_CONSTANT

Eine weitere Möglichkeit wäre es, das Feld bar tatsächlich als String zu speichern (und eine Konvertierung von und zu einem Enum im Getter/Setter durchzuführen).

Referenz

  • JPA 1.0 Spezifikation
    • Abschnitt 4.6.9 "Like-Ausdrücke"
    • Abschnitt 4.14 "BNF"

1voto

James Punkte 18499

Welchen JPA-Anbieter und welche Version verwenden Sie?

Dies sollte mit EclipseLink 2.1 funktionieren.

Andernfalls könnten Sie versuchen, eine Funktion auf die Enum anzuwenden, um sie in einen Varchar zu ändern, oder native SQL zu verwenden, oder sie stattdessen als String zu mappen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X