当前使用版本(必填,否则不予处理)
3.3.2
该问题是如何引起的?(确定最新版也有问题再提!!!)
数据库类型为PG,前端传入如下sql: with b as ( select db_id, max(time_stamp) time_stamp from t_mon_immediate where time_stamp > now() - INTERVAL '1 D' group by db_id ) select a.db_id, a.sys_ename, a.sys_cname, a.logical_room_cname, a.physical_room, a.physical_ip, a.ser_host, a.db_name, b.time_stamp from t_info_database a left join b on a.db_id = b.db_id where (time_stamp is null or time_stamp < now()- INTERVAL '15 S')
使用分页插件,后端将排序字段设置在Page对象中: page.setOrders(OrderItem.ascs(field));排序信息为order by time_stamp desc;
执行报出异常:显示找不到 with语句里面的 b
重现步骤(如果有就写完整)
报错信息
通过打印mybatis plus执行信息,显示如下: ==> Preparing: SELECT COUNT(1) FROM ( with b as ( select db_id, max(time_stamp) time_stamp from t_mon_immediate where time_stamp > now() - INTERVAL '1 D' group by db_id ) select a.db_id, a.sys_ename, a.sys_cname, a.logical_room_cname, a.physical_room, a.physical_ip, a.ser_host, a.db_name, b.time_stamp from t_info_database a left join b on a.db_id = b.db_id where (time_stamp is null or time_stamp < now()- INTERVAL '15 S') ) TOTAL ==> Parameters: <== Columns: count <== Row: 345 ==> Preparing: SELECT a.db_id, a.sys_ename, a.sys_cname, a.logical_room_cname, a.physical_room, a.physical_ip, a.ser_host, a.db_name, b.time_stamp FROM t_info_database a LEFT JOIN b ON a.db_id = b.db_id WHERE (time_stamp IS NULL OR time_stamp < now() - INTERVAL '15 S') ORDER BY time_stamp DESC limit ? offset ? ==> Parameters: 10(Long), 0(Long) 发现真正执行时,mybatis plus把with语句给丢了,造成找不到b信息。
如果我不将排序信息设置在page中,语句就执行正常。我跟踪了下源码,PaginationInterceptor类里面的concatOrderBy(String originalSql, IPage<?> page)方法,把sql给拼接错误了,返回的是selectbody,把withitemlist信息丢了。
Comment From: qmdx
复杂 sql 无法处理你需要关闭自动 count 功能,手动设置值
Comment From: dpengpeng
复杂 sql 无法处理你需要关闭自动 count 功能,手动设置值
因为我写的是通用执行sql接口,对sql的复杂度未知,这样的话我只能关闭在page里存放order by信息了,我暂时是这么解决的。
Comment From: dpengpeng
复杂 sql 无法处理你需要关闭自动 count 功能,手动设置值 这个案例里面,我把MP的自动count优化是关闭了的,count现在是正常执行的,你是说因为count引起的吗?