枚举上的 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 是 单字符串文字或 字符值输入参数 (即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 节“Like 表达式” 第 4.14 节“BNF”

【讨论】:

太棒了,有同样的问题。不错的答案【参考方案2】:

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

这应该在 EclipseLink 2.1 中工作。

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

【讨论】:

我目前正在使用 Hibernate,尽管我试图坚持使用纯 JPA/JPQL。我最终检查了正在查询的字段的类型(通过 JPA 2.0 标准 API)。如果类型可以从 Enum 分配,那么我将 users 参数转换为适当的枚举值。

以上是关于枚举上的 JPQL LIKE 表达式的主要内容,如果未能解决你的问题,请参考以下文章

带有 CriteriaQuery 的 JSONB 列上的“LIKE”表达式

javaee 第11周

JPQL 构造函数表达式中的 JPQL 和子查询

JPQL:在构造函数表达式中接收集合

IN 表达式中的 JPQL LOWER 函数

正确的表达式不是 JPQL/HQL 查询中的有效表达式