目录
问题:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
这个错误是由于你的 SQL 查询违反了 MySQL 的 ONLY_FULL_GROUP_BY
模式。具体来说,SELECT
子句中包含了一个非聚合列(bpm_app.gwfp_field_template_attr.ID
),但该列没有出现在 GROUP BY
子句中,这导致了语法错误。
解决方法
方法 1:调整 SQL 查询
修改查询,确保所有非聚合列都出现在 GROUP BY
子句中。例如:
SELECT gwfp_field_template_attr.ID, column2, SUM(column3)
FROM bpm_app.gwfp_field_template_attr
GROUP BY gwfp_field_template_attr.ID, column2;
方法 2:使用聚合函数
如果你不需要 gwfp_field_template_attr.ID
的具体值,而是希望选择某个特定值(如最大值或最小值),可以使用聚合函数。例如:
SELECT MAX(gwfp_field_template_attr.ID) AS ID, column2, SUM(column3)
FROM bpm_app.gwfp_field_template_attr
GROUP BY column2;
方法 3:禁用 ONLY_FULL_GROUP_BY
模式
如果你确定查询逻辑是正确的,并且理解禁用 ONLY_FULL_GROUP_BY
的潜在风险,可以通过以下方式禁用它:
临时禁用(当前会话):
SET sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '');
永久禁用(全局设置):
编辑 MySQL 配置文件(my.cnf
或 my.ini
),找到或添加以下内容
[mysqld]
sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
通过 SQL 命令修改:
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
方法 4:检查 Spring 配置
如果你使用的是 Spring Boot,可以在 application.properties
或 application.yml
文件中配置 SQL 模式:
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?
useSSL=false&serverTimezone=UTC&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
推荐的解决方法
优先推荐方法 1,即调整 SQL 查询,确保所有非聚合列都出现在 GROUP BY
子句中。这种方法符合 SQL 标准,并且避免了潜在的数据一致性问题。
如果你确实需要使用非聚合列的值,并且理解禁用 ONLY_FULL_GROUP_BY
的风险,可以选择方法 3 或方法 4。但请注意,禁用 ONLY_FULL_GROUP_BY
可能导致查询结果的不确定性,因为 MySQL 会选择分组中的任意值作为结果。
如果你选择禁用 ONLY_FULL_GROUP_BY
,请确保在开发和生产环境中保持一致的配置,以避免意外的错误。