Порядок в запросе JPQL на аннотированной карте @ElementCollection

#java #hibernate #jpql

Вопрос:

В моем @Entity аннотированном Course классе у меня есть следующая @ElementCollection аннотированная карта:

 @ElementCollection
private Map<Student, Double> courseStudAndAvgStudGrade;
 

В приведенном выше примере Учащийся-это еще @Entity один аннотированный класс, и значение-это средняя оценка от а Course для каждого Student . Я пытаюсь написать запрос в JPQL, который извлекал бы все записи этой карты и сортировал по значению записи в порядке убывания.

До сих пор у меня есть следующее:

 TypedQuery<Tuple> query =
              em.createQuery("SELECT KEY(map), VALUE(map) "
                        "FROM Course c JOIN c.courseStudAndAvgStudGrade map WHERE c.id = :id", Tuple.class);
 

Это правильно извлекает значения в a Tuple для желаемого Course , однако добавление ORDER BY VALUE(map) DESC в запрос JPQL приводит к a java.sql.SQLException: Subquery returns more than 1 row .

Можно ли это сделать ORDER BY на карте в JPQL?

Ответ №1:

JPA/Hibernate не требует VALUE квалификатора, т. е. на самом деле он существует только для полноты. Попробуйте выполнить следующий запрос:

 em.createQuery("SELECT KEY(map), map FROM Course c JOIN c.courseStudAndAvgStudGrade map WHERE c.id = :id ORDER BY map DESC", Tuple.class);