枚举上的JPQL LIKE表达式

时间:2010-09-08 13:52:44

标签: java orm jpa jpql

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] 

2 个答案:

答案 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 是一个   单字符字符串文字或   字符值输入参数   (即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字段实际存储为String(并在getter / setter中对枚举进行一些转换)。

参考

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

答案 1 :(得分:1)

您使用的是哪个JPA提供商和版本?

这应该在EclipseLink 2.1中有效。

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