java - 为 Jpa 存储库设置 sql_mode=(SELECT REPLACE(@@sql_mode ,'ONLY_FULL_GROUP_BY' ,'' ))

标签 java mysql spring-boot group-by spring-data-jpa

我正在尝试使用这样的自定义查询:

@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: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db_oem.managerwor0_.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

我知道使用

在 MySQL 上修复此错误的方法

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))

,有没有办法对 JpaRepository 做同样的事情?

最佳答案

您的查询不正确。您正在选择不在分组依据的结果表中的列。它与 Java 或 JPA 无关。

您正在创建一个新表。每个 zoneId 都有一行。假设在原始表中有多个具有特定 zoneId 的行,并且对于至少一列,这些行中有不同的值。它应该在新表中使用哪一个?这是做不到的。

您还可以按多列分组。在新表中,这些列的每种组合都会有一行。

因此,在新表中,您可以选择分组依据中的列,在您的情况下为 zoneId。您还可以在新表中放入哪些其他内容?例如,对于一个 zoneId,一列有多少个值。这是可以做到的。或者一列的最大值或最小值(记住它有多个值)。这也可以做到。这就是他们所说的聚合体。

关于java - 为 Jpa 存储库设置 sql_mode=(SELECT REPLACE(@@sql_mode ,'ONLY_FULL_GROUP_BY' ,'' )),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55200224/

相关文章:

java - 使用 Java 类路径执行 Java 9+ 服务

java - HTTP 代理连接共享

php - 每 x 天/月/年执行脚本内的任务,具体取决于 db 值

mysql - 全文 InnoDB 搜索没有响应

java - Spring Boot - 配置了两个数据源 - 如何使用第二个数据源?

java - webview离线时隐藏或替换 "webpage not available"

java - 如何控制DateFormat返回的月日名称大小写?

php - 每天自动更新数据库

java - LazyToOne 和 Spring LoadTimeWeaver

spring-boot - Spring Batch ChunkRequest 抛出 stackOverflow