Java 枚举上的类JPQL表达式

Java 枚举上的类JPQL表达式,java,orm,jpa,jpql,Java,Orm,Jpa,Jpql,JPQL能否针对枚举执行类似的表达式 如果我有一个带有枚举字段栏的实体Foo,我可以在MySQL中执行以下操作(bar存储为MySQL枚举) 但是,JPQL中的相应查询 SELECT f FROM Foo f WHERE f.bar LIKE '%SUFFIX' ……抱怨 Parameter value [%SUFFIX] was not matching type [com.example.Foo$EnumType] 我认为这是不可能的,像这样的的左边应该是一个字符串表达式(在标准JPA

JPQL能否针对枚举执行类似的表达式

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

但是,JPQL中的相应查询

SELECT f FROM Foo f WHERE f.bar LIKE '%SUFFIX'
……抱怨

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

我认为这是不可能的,像这样的
的左边应该是一个字符串表达式(在标准JPA中)。根据规范:

4.6.9类似的表达 使用的语法 比较运算符[不]类似于 条件表达式如下所示:

string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
字符串_表达式必须具有 字符串值。模式_值为 字符串文字或字符串值 输入参数,其中下划线 ()代表任何单个字符, 百分比(%)字符表示任何 字符序列(包括 空序列),以及所有其他 人物代表他们自己。这个 可选的转义字符是 单字符串文字或 字符值输入参数 (即,
char
Character
)并且 用来逃避 下划线和百分比字符 在模式_值中

枚举表达式不是字符串表达式

不过,以下操作可以(使用枚举文字):

另一个选项是将
字段实际存储为
字符串
(并在getter/setter中执行从枚举到枚举的转换)

参考文献
  • JPA1.0规范
    • 第4.6.9节“类似表达”
    • 第4.14节“BNF”

您使用的JPA提供商和版本是什么

这应该在EclipseLink 2.1中起作用


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

我目前正在使用Hibernate,但我尝试使用纯JPA/JPQL。我最后检查了被查询字段的类型(通过JPA2.0标准API)。如果类型是可从Enum分配的,那么我将users参数强制转换为相应的Enum值。回答得好
string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
SELECT f 
  FROM Foo f 
 WHERE f.bar = com.acme.Bar.SOME_CONSTANT 
    OR f.bar = com.acme.Bar.SOME_OTHER_CONSTANT