4

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

如果我有一个带有枚举字段 bar 的实体 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] 
4

2 回答 2

7

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

4.6.9 点赞表达式

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

string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]

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

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

参考

  • JPA 1.0 规范
    • 第 4.6.9 节“Like 表达式”
    • 第 4.14 节“BNF”
于 2010-09-08T20:11:34.700 回答
1

您使用的是什么 JPA 提供程序和版本?

这应该在 EclipseLink 2.1 中工作。

否则,您可以尝试将函数应用于枚举以将其更改为 varchar,或使用本机 SQL,或将其映射为字符串。

于 2010-09-09T13:29:34.497 回答