Hibernate @Filter枚举列类型

时间:2019-12-22 17:46:34

标签: java sql hibernate jpa kotlin

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

但是在这个问题中,查询者似乎在数据库中具有枚举类型的varchar,对我来说很好用。

我的观点是试图在数据库中具有枚举列类型的实体值上使用休眠过滤器注释。假设该列的枚举类型称为“ 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
}

使用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= ? 

最后,加载枚举实体时引发的异常是由以下原因引起的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

和其他一些。

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

1 个答案:

答案 0 :(得分:0)

好的,为任何可以从中受益的人提供解决方案。

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

cast(enumColumn as text) in (:enumTypeParam)

像魅力一样工作。