Skip to content

Commit d63b282

Browse files
author
彭卫东
committed
fix:Fix: 修复含特殊 ORDER BY 的查询生成总数 SQL 时的语法错误
--在 isSimpleCount 方法中新增对 ORDER BY 条件的判断逻辑,当查询包含含占位符的 CASE WHEN 排序、布尔排序等特殊 ORDER BY 子句时,不再误判为 "简单查询",避免生成包含ORDER BY的COUNT(0)错误SQL,解决聚合查询中ORDER BY字段未参与GROUP BY的语法报错问题。
1 parent 4db191c commit d63b282

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

src/main/java/com/github/pagehelper/parser/defaults/DefaultCountSqlParser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,10 @@ public Select sqlToCount(Select select, String name) {
162162
* @return
163163
*/
164164
public boolean isSimpleCount(PlainSelect select) {
165+
//包含order by的时候不可以
166+
if (select.getOrderByElements() != null) {
167+
return false;
168+
}
165169
//包含group by的时候不可以
166170
if (select.getGroupBy() != null) {
167171
return false;

src/test/java/com/github/pagehelper/mapper/UserMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,8 @@ public interface UserMapper {
135135
List<Map<String, Object>> execute(@Param("sql") String sql);
136136

137137
List<UserCode> selectByCode(Code code);
138+
139+
List<User> selectOrderByBool(@Param("py") String py);
140+
141+
List<User> selectOrderByCase(@Param("py") String py);
138142
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.github.pagehelper.test.basic.count;
2+
3+
import com.github.pagehelper.Page;
4+
import com.github.pagehelper.PageHelper;
5+
import com.github.pagehelper.mapper.UserMapper;
6+
import com.github.pagehelper.model.User;
7+
import com.github.pagehelper.util.MybatisHelper;
8+
import org.apache.ibatis.session.SqlSession;
9+
import org.junit.Test;
10+
11+
/**
12+
* @author light pwd
13+
* @description
14+
* @date 2025/10/22
15+
*/
16+
public class TestOrderBy {
17+
18+
@Test
19+
public void testOrderByBool() throws ClassNotFoundException {
20+
Class.forName("org.postgresql.Driver");
21+
SqlSession sqlSession = MybatisHelper.getSqlSession();
22+
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
23+
try {
24+
Page<User> page = PageHelper.startPage(1, 10);
25+
userMapper.selectOrderByBool("ZSJ");
26+
} finally {
27+
sqlSession.close();
28+
}
29+
}
30+
31+
32+
@Test
33+
public void testOrderByCase() throws ClassNotFoundException {
34+
Class.forName("org.postgresql.Driver");
35+
SqlSession sqlSession = MybatisHelper.getSqlSession();
36+
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
37+
try {
38+
Page<User> page = PageHelper.startPage(1, 10);
39+
userMapper.selectOrderByCase("CNZ");
40+
} finally {
41+
sqlSession.close();
42+
}
43+
}
44+
}

src/test/resources/com/github/pagehelper/mapper/UserMapper.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,4 +569,17 @@
569569
left join salaries s on e.emp_no = s.emp_no
570570
order by e.emp_no, s.from_date
571571
</select>
572+
573+
<select id="selectOrderByBool" resultType="com.github.pagehelper.model.User">
574+
select *
575+
from public."user"
576+
order by py = #{py} desc nulls last
577+
</select>
578+
579+
<select id="selectOrderByCase" resultType="com.github.pagehelper.model.User">
580+
select *
581+
from public."user"
582+
order by CASE WHEN py = #{py} THEN 0 ELSE 1 END,
583+
py DESC NULLS LAST
584+
</select>
572585
</mapper>

0 commit comments

Comments
 (0)