代码之家  ›  专栏  ›  技术社区  ›  Pace

枚举上类似JPQL的表达式

  •  3
  • Pace  · 技术社区  · 14 年前

    jpql可以对枚举执行类似的表达式吗?

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

    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 回复  |  直到 14 年前
        1
  •  6
  •   Pascal Thivent    14 年前

    我认为这是不可能的 LIKE 应该是一个 字符串表达式 (标准JPA)。根据规范:

    4.6.9类似表达

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

    string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
    

    这个 字符串表达式 必须有 字符串值。这个 图案化值 是 字符串文字或字符串值 输入参数,其中下划线 (u)表示任何单个字符, 百分比(%)字符表示任何 字符序列(包括 空序列),以及所有其他 人物代表他们自己。这个 可选择的 转义符 是一个 单个字符串文本或 字符值输入参数 (即, char Character 并且是 用来逃避 下划线和百分比字符 在里面 图案化值 .

    和一个 枚举表达式 不是一个 字符串表达式 .

    但是,以下方法是可行的(使用 枚举文字 ):

    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”
        2
  •  1
  •   James    14 年前

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

    这应该在EclipseLink 2.1中有效。

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