УСТАНОВИТЕ sql_mode=(ВЫБЕРИТЕ REPLACE(@@sql_mode,’ONLY_FULL_GROUP_BY’,»)) для репозитория Jpa

#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. Какие еще параметры вы можете поместить в новую таблицу? Например, сколько значений столбца существует для идентификатора зоны. Это можно сделать. Или максимальное или минимальное значение столбца (помните, который имеет несколько значений). Это также можно сделать. Это агрегаты, о которых они говорили.