Как вернуть список карт пар ключ/значение из запроса JPQL с помощью EclipseLink?

Я пробовал это решение:

List<javax.persistence.Tuple> result = entityManager.createQuery("select f.Id as Id, f.Project as Project from FirewallRequest f", javax.persistence.Tuple.class)
                                                    .getResultList();
result.get(0).get("Project");

Я получаю это:

java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class javax.persistence.Tuple ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; javax.persistence.Tuple is in unnamed module of loader java.net.URLClassLoader @7a9273a8)

Таким образом, кажется, что возвращается List из Objects вместо Tuples. Tuple не поддерживается EclipseLink или в чем проблема?

Отладчик показывает, что на самом деле это Vector из Objects:

введите здесь описание изображения

Я использую TomEE 8, который использует EclipseLink 2.7.4.v20190115 для JPA. Я мог бы попробовать с JPA Criteria Query, но я конвертирую из SQL, и было бы проще преобразовать его в JPQL.

Изменить 1

Вот ответ автора связанной статьи, который также предполагает, что это должно работать.

Изменить 2

Создана проблема EclipseLink.

Изменить 3

К счастью, он работает с JPA Criteria Query (CriteriaBuilder#createTupleQuery()). Больше работы по преобразованию SQL в это, но, по крайней мере, это работает.


person Panu Haaramo    schedule 25.04.2020    source источник


Ответы (1)


Запрос с проекцией всегда возвращает List<Object[]>

Пока вы не используете выражение конструктора с

select new x.y.Tuple(f.Id, f.Project) from FirewallRequest f

Но тогда вам нужен кортеж с конструктором, соответствующим проекции.

person Simon Martinelli    schedule 25.04.2020
comment
Значит, код в связанном примере (в котором даже есть утверждения) никогда не будет работать? - person Panu Haaramo; 25.04.2020
comment
Похоже, EclipseLink его не поддерживает. - person Simon Martinelli; 25.04.2020
comment
Хорошо, я так и думал, будет работать с Hibernate. - person Panu Haaramo; 25.04.2020
comment
О, я просто вижу еще одну проблему. Является ли проект сущностью? - person Simon Martinelli; 25.04.2020
comment
Нет, это поле String в сущности. - person Panu Haaramo; 25.04.2020
comment
Я пробовал с Hibernate, и это работает. Можете ли вы попробовать использовать новейшую версию EclipseLink? - person Simon Martinelli; 25.04.2020
comment
Это совершенно новый продукт, и он входит в состав TomEE. Я могу исследовать. - person Panu Haaramo; 25.04.2020
comment
Мне удалось обновиться до последней версии 2.7.6 с зависимостью от Maven, но это не помогло. - person Panu Haaramo; 25.04.2020
comment
Пытался переключиться в Hibernate, но всегда получаю ClassNotFoundException: org.hibernate.ejb.HibernatePersistence, несмотря на наличие всех необходимых зависимостей. - person Panu Haaramo; 25.04.2020