JPA CriteriaBuilder со встроенными ElementCollections - PullRequest
1 голос
/ 24 марта 2020

Я пытаюсь сделать запрос от объекта, который имеет встроенную сущность, содержащую 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, оба не работали.

1 Ответ

0 голосов
/ 25 марта 2020

Хотя EmbeddedObject не имеет соответствующей таблицы базы данных, решением было join it и MyEnum вместо использования get:

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