Hibernate @Filter для типа столбца enum - PullRequest
1 голос
/ 22 декабря 2019

Этот вопрос похож на этот: Hibernate @Filter коллекция перечислений

Но в этом вопросе похоже, что у спрашивающего есть тип enum 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= ? 

Наконец, возникло исключениекогда я загружаю объект enum, возникает исключение 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

фильтрация критериев гибернации на наборезначения enum

и некоторые другие.

Любая помощь или советы здесь будут оценены. Спасибо!

1 Ответ

0 голосов
/ 24 декабря 2019

Хорошо, получил решение для всех, кто мог бы извлечь из этого пользу.

Вам нужно привести столбец к тексту, а не привести параметры к перечислению ....

cast(enumColumn as text) in (:enumTypeParam)

Работает как шарм.

...