Как получить содержимое таблицы @ElementCollection, сопоставленной через @MapKeyColumn - PullRequest
1 голос
/ 17 июня 2019

Здесь много подобных вопросов, но после долгих поисков я не нашел этот вопрос или ответ на него.

У меня есть объект с @ElementCollection, отображенным так:

@Entity
public class MyEntity {
    ...
    @ElementCollection(fetch = FetchType.EAGER)
    @MapKeyColumn(name = "value")
    @Column(name = "description")
    private Map<String, String> validValues = new HashMap<>();

    @Column
    protected Long otherId;

Эта конфигурация работает нормально, я не указал имя для сопоставленной таблицы, но Hibernate создал ее автоматически из сопоставления и назвал ее my_entity_valid_values. Извлечение этих значений через Hibernate отлично работает для каждого экземпляра MyEntity, проблема в производительности для больших наборов данных.

В моем приложении я могу иметь большие коллекции MyEntity объектов, и вместо того, чтобы полагаться на энергичную выборку Hibernate, которая генерирует n запросов, я бы хотел получить их все самостоятельно. Я пытаюсь это HQL:

select e.id,vv from MyEntity e join e.validValues vv where e.otherId=14

Это приводит к следующему SQL:

select
    myentity0_.id as col_0_0_,
    validvalue1_.description as col_1_0_ 
from
    my_entity myentity0_ 
inner join
    my_entity_valid_values validvalue1_ 
        on myentity0_.id=validvalue1_.my_entity_id 
where
    myentity0_.other_id=14

Таблица my_entity_valid_values, созданная Hibernate, имеет 3 столбца, my_entity_id, который является внешним ключом к исходной таблице, а также столбцы value и description, которые представляют собой два столбца, которые представляют ключи и значения для сопоставления Map<String, String>.

Однако SQL, сгенерированный из ссылки vv в HQL, включает только столбец description, в котором отсутствует столбец value и отображается неполная картина этих данных. Как получить столбцы value и description в этом случае? Я пробовал HQL, например:

select e.id,vv.value,vv.description ...

Но это дает мне org.hibernate.QueryException: cannot dereference scalar collection element.

Любые советы приветствуются!

1 Ответ

1 голос
/ 18 июня 2019

Благодаря этому ответу в другом вопросе Я понял это, ответ заключается в том, чтобы ссылаться на столбец сбора с помощью index() следующим образом:

select e.id,index(vv),vv from MyEntity e join e.validValues vv where e.otherId=14

Это добавляет value column (в моем случае столбец передан @MapKeyColumn) и возвращает все данные, которые мне нужны из запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...