#java #mysql #spring-boot #group-by #spring-data-jpa
#java — язык #mysql #пружинный ботинок #группировать по #spring-data-jpa #java #весенняя загрузка #сгруппировать по
Вопрос:
Я пытаюсь использовать пользовательский запрос, подобный этому:
@Query("SELECT i "
"FROM ManagerWorkplace i "
"WHERE i.managerId = ?1 "
"AND i.companyId = ?2 "
"GROUP BY i.zoneId")
List<ManagerWorkplace> findByManagerIdAndCompanyId(Long managerID, Long companyId);
но я получил эту ошибку:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Выражение # 1 списка ВЫБОРА отсутствует в предложении GROUP BY и содержит неагрегированный столбец ‘db_oem.managerwor0_.id ‘ который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode=only_full_group_by
Я знаю способ исправить эту ошибку в MySQL, используя
УСТАНОВИТЬ sql_mode=(ВЫБРАТЬ ЗАМЕНИТЬ(@@sql_mode,’ONLY_FULL_GROUP_BY’,»))
, есть ли какой-нибудь способ сделать то же самое для JpaRepository?
Ответ №1:
Ваш запрос не подходит. Вы выбираете столбцы, которых нет в таблице результатов группы by. Это не имеет никакого отношения к Java или JPA.
С помощью группы by вы создаете новую таблицу. Для каждого идентификатора зоны будет одна строка. Предположим, что в исходной таблице имеется несколько строк с определенным идентификатором зоны, и по крайней мере для одного столбца в этих строках разные значения. Какой из них следует использовать в новой таблице? Это невозможно сделать.
Вы также можете группировать по нескольким столбцам. В новой таблице будет одна строка для каждой комбинации этих столбцов.
Таким образом, в новой таблице вы можете выбрать для столбцов, которые находятся в группе by, в вашем случае ZoneId. Какие еще параметры вы можете поместить в новую таблицу? Например, сколько значений столбца существует для идентификатора зоны. Это можно сделать. Или максимальное или минимальное значение столбца (помните, который имеет несколько значений). Это также можно сделать. Это агрегаты, о которых они говорили.