JPQL可以针对枚举执行LIKE表达式吗?
如果我有一个带有枚举字段栏的实体Foo,我可以在MySQL中执行以下操作(bar存储为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]
答案 0 :(得分:6)
我认为不可能,LIKE
的左侧部分应该是 string_expression (在标准JPA中)。从规范:
4.6.9像表达式
使用的语法 比较运算符[NOT] LIKE in a 条件表达式如下:
string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
string_expression 必须有 字符串值。 pattern_value 是 字符串文字或字符串值 输入参数,其中有一个下划线 (_)代表任何单个字符, 百分比(%)代表任何字符 字符序列(包括 空序列),以及所有其他 人物代表自己。该 可选的 escape_character 是一个 单字符字符串文字或 字符值输入参数 (即
char
或Character
)并且是 习惯于逃避特殊的意义 下划线和百分比字符 在 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
另一种选择是将bar
字段实际存储为String
(并在getter / setter中对枚举进行一些转换)。
答案 1 :(得分:1)
您使用的是哪个JPA提供商和版本?
这应该在EclipseLink 2.1中有效。
否则,您可以尝试将函数应用于枚举,将其更改为varchar,或使用本机SQL,或将其映射为String。