#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);