【问题标题】:JPA CriteriaBuilder with embedded ElementCollections具有嵌入式 ElementCollections 的 JPA CriteriaBuilder
【发布时间】:2020-03-24 19:04:42
【问题描述】:

我正在尝试从具有包含 ElementCollection 的嵌入式实体的对象中进行查询

enum class MyEnum {VALUE1, VALUE2}

data class MyObject(

    @Embedded
    val embedded: EmbeddedObject? = EmbeddedObject(),
)


@Embeddable
data class EmbeddedObject(

    @ElementCollection(targetClass = MyEnum::class)
    @CollectionTable(name = "t_my_enum", joinColumns = [JoinColumn(name = "fk_my_object")])
    @Column(name = "enum_value")
    @Enumerated(value = STRING)
    val enumValues: Set<MyEnum> = mutableSetOf(),
}

我现在正在尝试过滤结果以包含来自MyEnum 的一组值。 当前方法(不起作用):

    val myFilter = mutableSetOf(VALUE1)
    val criteria: CriteriaBuilder = entityManager.criteriaBuilder
    val query: CriteriaQuery<MyObject> = criteria.createQuery(MyObject::class.java)
    val root: Root<MyObject> = query.from(MyObject::class.java)
    root.where(root.get<EmbeddedObject>("embedded").get<Set<MyEnum>>("enumValues").`in`(myFilter)))

此操作失败并显示以下错误消息:

java.lang.IllegalArgumentException: Parameter value [VALUE1] did not match expected type [java.util.Set (n/a)]

我也尝试加入 EmbeddedObject 或 enumValues 列,均无效。

【问题讨论】:

    标签: hibernate jpa criteria-api


    【解决方案1】:

    虽然EmbeddedObject没有对应的数据库表,但解决方法是join它和MyEnum,而不是get

    root.where(root.join<MyObject, EmbeddedObject>("embedded").join<EmbeddedObject, MyEnum>("enumValues").`in`(myFilter))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-15
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多