枚举上的JPQL LIKE表达式

Pac*_*ace 3 java orm jpa jpql

JPQL可以对枚举执行LIKE表达式吗?

如果我有一个带有枚举字段栏的实体Foo,我可以在MySQL中执行以下操作(条形存储为MySQL枚举)...

SELECT * FROM Foo WHERE `bar` LIKE '%SUFFIX'
Run Code Online (Sandbox Code Playgroud)

但是,JPQL中的相应查询...

SELECT f FROM Foo f WHERE f.bar LIKE '%SUFFIX'
Run Code Online (Sandbox Code Playgroud)

......抱怨......

Parameter value [%SUFFIX] was not matching type [com.example.Foo$EnumType] 
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 6

我不认为这是可能的,a的左边部分LIKE应该是string_expression(在标准JPA中).从规格:

4.6.9像表达式一样

在条件表达式中使用比较运算符[NOT] LIKE的语法如下:

string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
Run Code Online (Sandbox Code Playgroud)

string_expression必须有一个字符串值.所述pattern_value是一个字符串或其中的下划线(_)代表任何单个字符一个字符串值的输入参数,百分比(%)字符表示任何字符序列(包括空序列),而所有其他字符站为了自己.可选ESCAPE_CHARACTER是单字符串文字或字符值输入参数(即,charCharacter),并用于逃避下划线和百分比字符的特殊含义pattern_value.

并且enum_expression不是string_expression.

以下将工作(使用枚举文字):

SELECT f 
  FROM Foo f 
 WHERE f.bar = com.acme.Bar.SOME_CONSTANT 
    OR f.bar = com.acme.Bar.SOME_OTHER_CONSTANT
Run Code Online (Sandbox Code Playgroud)

另一种选择是将bar字段实际存储为String(并在getter/setter中对枚举进行一些转换).

参考

  • JPA 1.0规范
    • 第4.6.9节"像表达式"
    • 第4.14节"BNF"