java - Hibernate @Filter 枚举列类型

标签 java sql hibernate jpa kotlin

这是一个与此类似的问题:Hibernate @Filter collection of enums

但在这个问题中,提问者在数据库上有一个 varchar 枚举类型,这对我来说工作得很好。

我的问题是当尝试对数据库中具有枚举列类型的实体值使用 hibernate 过滤器注释时。假设该列的枚举类型称为“database_enum”

获取实体:

@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
}

使用枚举类:

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())

hibernate 日志记录中的查询显示过滤器为:

SELECT ...
where
        enum_column.enum_type= ? 

最后,当我加载枚举实体时引发的异常是由以下原因引起的 SQLGrammarException:

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

我想知道是否需要重构一些东西,并将枚举保留在 kotlin 端,并在数据库中为其指定 varchar 类型。我无法找到类似的帖子/问题并提供任何有用的答案,但这是我查看的内容:

https://forum.hibernate.org/viewtopic.php?f=1&t=1044249&view=previous

hibernate criteria filtering on a set of enum values

还有其他一些。

如果有任何帮助或提示,我们将不胜感激。谢谢!

最佳答案

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

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

cast(enumColumn as text) in (:enumTypeParam)

就像魅力一样。

关于java - Hibernate @Filter 枚举列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59446649/

相关文章:

java - Maven 阴影插件自定义转换器

java - 以特定数字为增量生成双随机数

java - this.getHibernateTemplate().delete(bp) 不会立即删除

java - 如何在第二个屏幕上使用 GUI 启动 jar 文件

java - Edittext 只允许字母(以编程方式)

mysql - Wordnet 查询返回例句

php - 如何反转 MySQL 查询的输出顺序

sql - Hive SQL Integer YYYYMM 前几个月

hibernate - 为什么要将 hibernate SessionFactory 绑定(bind)到 JNDI 资源?

java - 使用哪种模式打开和关闭 hibernate session (MyFaces 2.2.2 + Spring 4.0.3 + Hibernate 4.3.2)