枚举上的 JPQL LIKE 表达式
Posted
技术标签:
【中文标题】枚举上的 JPQL LIKE 表达式【英文标题】:JPQL LIKE expression on enum 【发布时间】:2010-09-08 13:52:44 【问题描述】: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]
【问题讨论】:
【参考方案1】:我认为不可能,LIKE
的左侧部分应该是 string_expression(在标准 JPA 中)。来自规范:
4.6.9 Like 表达式
使用的语法 比较运算符 [NOT] LIKE 在 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 中与枚举进行一些转换)。
参考
JPA 1.0 规范 第 4.6.9 节“Like 表达式” 第 4.14 节“BNF”【讨论】:
太棒了,有同样的问题。不错的答案【参考方案2】:您使用的是什么 JPA 提供程序和版本?
这应该在 EclipseLink 2.1 中工作。
否则,您可以尝试将函数应用于枚举以将其更改为 varchar,或使用本机 SQL,或将其映射为字符串。
【讨论】:
我目前正在使用 Hibernate,尽管我试图坚持使用纯 JPA/JPQL。我最终检查了正在查询的字段的类型(通过 JPA 2.0 标准 API)。如果类型可以从 Enum 分配,那么我将 users 参数转换为适当的枚举值。以上是关于枚举上的 JPQL LIKE 表达式的主要内容,如果未能解决你的问题,请参考以下文章