具有嵌入式 ElementCollections 的 JPA CriteriaBuilder
JPA CriteriaBuilder with embedded ElementCollections
我正在尝试从具有包含 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 列,都没有用。
虽然EmbeddedObject
没有对应的数据库table,解决方案是join
它和MyEnum
而不是使用get
:
root.where(root.join<MyObject, EmbeddedObject>("embedded").join<EmbeddedObject, MyEnum>("enumValues").`in`(myFilter))
我正在尝试从具有包含 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 列,都没有用。
虽然EmbeddedObject
没有对应的数据库table,解决方案是join
它和MyEnum
而不是使用get
:
root.where(root.join<MyObject, EmbeddedObject>("embedded").join<EmbeddedObject, MyEnum>("enumValues").`in`(myFilter))