1.报错问题描述:
使用MybatisFlex的链式QueryChain查询语句为:
List<Account> list = QueryChain.of(mapper)
.select(
ACCOUNT.ALL_COLUMNS,
max(ACCOUNT.AGE).as("maxAge"),
avg(ACCOUNT.AGE).as("avgAge")
).groupBy(ACCOUNT.AGE)
.list();
实际在数据库执行的sql语句为:
SELECT *, MAX(`age`) AS `maxAge`, AVG(`age`) AS `avgAge` FROM `tb_account`
WHERE `is_delete` = ? GROUP BY `age`
接着报错如下:
org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: java.sql.SQLSyntaxErrorException:
Expression #1 of SELECT list is not in GROUP BY clause and contains
nonaggregated column 'mybatis-flex.tb_account.account_id' which is
not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by
2.查看问题思路:
大概报错意思就是:SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含
非聚合列 'mybatis-flex.tb_account.account_id',在功能上不依赖于 GROUP BY 子句中的列;这
与 sql_mode=only_full_group_by 不兼容;
然后去查看了 sql_mode:
sql_mode:表示一组语法校验规则;
sql_mode=only_full_group_by表示:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中;
关于sqlMode的命令:
查询命令:
select @@global.sql_mode
设置命令:
set @@global.sql_mode ='校验规则列表';
3.总结问题原因:
select * 查询出了表tb_account中的所有列,比如ID,但是ID字段没有出现在sql语句的group by 后面,所以报错。
4.问题解决方法:
1.在数据库执行命令:
select @@global.sql_mode
可以看到第一个校验规则就是报错的校验规则。
然后把查询出来的值复制,删除掉“ONLY_FULL_GROUP_BY”,执行设置命令:
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
继续查询数据,可以暂时性的查询成功了,
但是,这样设置只对于这一次设置有效,如果数据库关闭了,或者重启之后,又会报同样的错误。
接下来进入mysql的安装文件夹查看my.ini文件:
打开该文件全局搜索Mode关键字,找到sql-mode如下:最后把ONLY_FULL_GROUP_BY规则删除掉就可以了。
继续回到数据库执行查询校验规则,发现已经删除了:
如果查看还是报错,可以重启项目再试试。