Как выполнить запрос JPQL, используя «group by» в проекции (Non-Entity-Class)?
Сценарий: у вас есть две таблицы: User и User_Role, и вы хотите узнать, сколько пользователей вваша система имеет роль «публичная», и сколько из них имеют роль «администратор» (любые другие роли, если они есть).
Например: я хочу запрос, который даст мне знать, что есть два пользователя, которые имеют"public" роль, и один пользователь имеет роль "admin".
Простейший пример:
@Query("SELECT ur.roleName, count(u.id) from User u left join u.userRole ur group by ur.roleName")
List<Object[]> getCounts();
В этом случае работа с результатом более сложна, чем обычно.Вам придется перебирать как список, так и массив объектов.
Запрос в проекцию Пример:
@Query("SELECT new com.skjenco.hibernateSandbox.bean.GroupResultBean(ur.roleName, count(u.id)) from User u left join u.userRole ur group by ur.roleName")
List<GroupResultBean> getCountsToBean();
Это даст вам список, с которым гораздо лучше работать.
Пример кода: https://github.com/skjenco/hibernateSandbox/blob/master/src/test/java/com/skjenco/hibernateSandbox/repository/UserProjectionExampleTest.java