当前位置: 首页 > 知识库问答 >
问题:

枚举列类型上的Hibernate@filter

范翰海
2023-03-14
@Entity
@Table(name = "table_1")
@TypeDefs(
  TypeDef(name = "enum", typeClass = PostgreSQLEnumType::class)
)
@Mockable
class table1{

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  var id: Int = 0

  ...

  @Enumerated(EnumType.STRING)
  @Type(type = "enum")
  lateinit var enumColumn: EnumClass
}

使用EnumClass:

enum class EnumClass{
  TYPEA(EnumSubClass.ONE),
  TYPEB(EnumSubClass.TWO),
  ...
  TYPEN(EnumSubClass.N);

  val category: EnumSubClass

  constructor(category: EnumSubClass) {
    this.category = category
  }

  companion object {
    ...
  }
}

筛选器位于父实体上:

@Entity
@Table(name = "mla_simulation_turbine")
@FilterDefs(
  FilterDef(name = "enumTypeFilter", parameters = [ParamDef(name="enumTypeParam", type="string")])
)
@Mockable
class ParentEntity{

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  var id: Int = 0


  @OneToMany(mappedBy = "...", fetch = FetchType.LAZY)
  @Filters(
    Filter(name = "enumTypeFilter", condition="enumColumn= :enumTypeParam")
  )
  var components = mutableSetOf<EnumClass>()


}

过滤器是这样设置的:

val existingSession = em.unwrap(Session::class.java)
      existingSession.enableFilter("enumTypeFilter")
        .setParameter("enumTypeParam", EnumClass.TYPEA.toString())

SELECT ...
where
        enum_column.enum_type= ? 
Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: database_enum= character varying
  Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
  Position: 925

和其他几个。

这里的任何帮助或提示都将不胜感激。谢了!

共有1个答案

耿弘阔
2023-03-14

好的,为任何可以从中受益的人找到了解决方案。

您需要将列强制转换为文本,而不是将参数强制转换为枚举....

cast(enumColumn as text) in (:enumTypeParam)

像魅力一样有效。

 类似资料:
  • 问题内容: 例如,我该怎么做: 结果示例: 问题答案: 迅捷4.2+ 从Swift 4.2(使用Xcode 10)开始,只需添加协议一致性即可从中受益。要添加此协议一致性,您只需要在某处写: 如果枚举是您自己的,则可以直接在声明中指定一致性: 然后,以下代码将打印所有可能的值: 与早期Swift版本(3.x和4.x)的兼容性 如果您需要支持Swift 3.x或4.0,则可以通过添加以下代码来模仿S

  • 枚举类(“新的枚举”/“强类型的枚举”)主要用来解决传统的C++枚举的三个问题: 传统C++枚举会被隐式转换为int,这在那些不应被转换为int的情况下可能导致错误 传统C++枚举的每一枚举值在其作用域范围内都是可见的,容易导致名称冲突(同名冲突) 不可以指定枚举的底层数据类型,这可能会导致代码不容易理解、兼容性问题以及不可以进行前向声明 枚举类(enum)(“强类型枚举”)是强类型的,并且具有类

  • 枚举类型(也可以称为“枚举器”)由一组具有独立标识符(名称)的整数类型常量构成,在 C# 中枚举类型不仅可以在类或结构体的内部声明,也可以在类或结构体的外部声明,默认情况下枚举类型中成员的默认值是从 0 开始的,然后逐一递增。 在 C# 中可以使用 enum 关键字来声明枚举类型,语法格式如下所示: enum enum_name{     enumeration list; } 其中,enum_n

  • 枚举是为了让程序可读性更好,比如用来描述用户的角色,普通的会员、付费的会员等,同时也限定了用户角色的种类,保证安全性,不会出现上帝角色这种乱入的东西。 枚举的类别与写法 默认值从0开始,依次递增,这个你应该还记得。 普通的枚举 let str = 'something' enum test{ test01, } enum FileAccess { None, Read

  • 上一章我们谈到了从真实世界的值(如扑克牌中的大小和花色)到程序世界内部表示(如整数或字符串)的映射。虽然我们实现了牌面大小和整型数、花色和整型数之间的映射,但必须指出,映射本身并没有成为程序的一部分。 实际上,C++提供了一种称为“枚举类型”的特性使以下两点成为可能,一是将映射作为程序的一部分,一是定义了组成映射的值的集合。比如,牌的花色(Suit)和大小(Rank)可以以枚举的形式定义: enu

  • 创建枚举 import enum class BugStatus(enum.Enum): new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 print('\nMember name: {}'.