Этот вопрос похож на этот: 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
и некоторые другие.
Любая помощь или советы здесь будут оценены. Спасибо!