JPQL как выражение на enum - PullRequest
       13

JPQL как выражение на enum

3 голосов
/ 08 сентября 2010

Может ли JPQL выполнять выражения LIKE для перечислений?

Если у меня есть сущность Foo с полем перечисления, я могу выполнить следующее в MySQL (строка хранится как перечисление MySQL) ...

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

Однако соответствующий запросв JPQL ...

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

... жалуется, что ...

Parameter value [%SUFFIX] was not matching type [com.example.Foo$EnumType] 

Ответы [ 2 ]

6 голосов
/ 09 сентября 2010

Я не думаю, что это возможно, левая часть LIKE должна быть string_expression (в стандартном JPA).Из спецификации:

4.6.9 Подобные выражения

Синтаксис использования оператора сравнения [NOT] LIKE в условном выражении следующий:

string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]

string_expression должно иметь строковое значение. pattern_value является строковым литералом или строковым входным параметром, в котором подчеркивание (_) обозначает любой отдельный символ, символ процента (%) обозначает любую последовательность символов (включая пустую последовательность)и все остальные персонажи стоят за себя.Необязательный escape_character представляет собой односимвольный строковый литерал или символьный входной параметр (т. Е. char или Character) и используется для удаления специального значения символов подчеркивания и процентов в pattern_value .

И enum_expression не является string_expression .

Следующее будет работать, хотя (используя литералы enum ):

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

Другим вариантом будет сохранение поля bar в виде String (и некоторое преобразование из и в перечисление в получателе /setter).

Ссылка

  • JPA 1.0 Спецификация
    • Раздел 4.6.9 "Подобные выражения"
    • Раздел 4.14 "BNF"
1 голос
/ 09 сентября 2010

Какой провайдер и версию JPA вы используете?

Это должно работать в EclipseLink 2.1.

В противном случае вы можете попробовать применить функцию к enum, чтобы изменить ее на varchar, или использоватьродной SQL или сопоставьте его как строку.

...