使用mybatis plus 自带的分页时报错
xml 中的sql :
SELECT f.id, CONCAT(f.name,'评价') name, a.create_time, '作者' create_user FROM ( SELECT id, MAX( create_time ) create_time FROM a <where> <if test="params.isAll == 'unall'">id like CONCAT('%',#{params.userId},'%') </if> </where> GROUP BY id ) a LEFT JOIN tabB f ON a.id = f.id <where> <if test="params.name!=null and params.name!='' "> name like concat('%',#{params.name},'%') </if> </where> order by a.create_time desc
打印日志:
Cause: java.sql.SQLSyntaxErrorException: Unknown column 'class_name' in 'where clause'
### The error may exist in file [D:\xxx\target\classes\mapper\xx\xx.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT COUNT(*) FROM (SELECT id, MAX(create_time) create_time FROM a GROUP BY id) a WHERE name LIKE concat('%', ?, '%')
### Cause: java.sql.SQLSyntaxErrorException: Unknown column 'name' in 'where clause'
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'name' in 'where clause'
我的 name 字段 在 表 tabB 中,mybatis plus 自带的 select count (*) 却只截取了部分sql。导致 name 加到了 子查询 结果集中。
解决方案: 在最外层 套一层 ,查询sql 成为一个 子查询结果集。
select * from (
SELECT f.id, CONCAT(f.name,'评价') name, a.create_time, '作者' create_user FROM ( SELECT id, MAX( create_time ) create_time FROM a <where> <if test="params.isAll == 'unall'">id like CONCAT('%',#{params.userId},'%') </if> </where> GROUP BY id ) a LEFT JOIN tabB f ON a.id = f.id <where> <if test="params.name!=null and params.name!='' "> name like concat('%',#{params.name},'%') </if> </where> order by a.create_time desc
) tabA
猜测发生原因
当sql 中 存在 () 时,mybatis plus 自带的分页 会直接使用 。导致发生sql 不完整问题。所以之后需要分页的sql。且这个sql存在子查询 或 ()时,要在最外层套一层 。防止发生问题!!!