mybatisFlex查询报错: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY

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规则删除掉就可以了。

继续回到数据库执行查询校验规则,发现已经删除了:

如果查看还是报错,可以重启项目再试试。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值