Эх сурвалжийг харах

修复MP解析吞空白导致摊位审核列表SQL语法错误(同步test-202609v2)

qmj 2 өдөр өмнө
parent
commit
72b62eb2da

+ 4 - 3
ruoyi-system/src/main/resources/mapper/chanting/StallQualificationMapper.xml

@@ -86,11 +86,12 @@
         LEFT JOIN stall_qualification_application a ON a.id = q.current_application_id
         WHERE s.user_id = #{marketId} AND s.is_stall = 1 AND s.del_flag = '0'
     </select>
+    <!-- MyBatis-Plus 解析会吞掉 where 内静态文本与 if 之间的空白(线上曾拼出 0AND 语法错误),首条件必须同样用 if 包裹。 -->
     <sql id="filter">
         <where>
-            status != 0
-            <if test="status != null">AND status = #{status}</if>
-            <if test="storeId != null">AND store_id = #{storeId}</if>
+            <if test="true">status != 0</if>
+            <if test="status != null"> AND status = #{status}</if>
+            <if test="storeId != null"> AND store_id = #{storeId}</if>
         </where>
     </sql>
     <select id="selectApplications" resultType="com.ruoyi.system.domain.StallQualificationSummary">

+ 43 - 0
ruoyi-system/src/test/java/com/ruoyi/system/mapper/StallQualificationMapperMpRenderTest.java

@@ -0,0 +1,43 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder;
+import org.apache.ibatis.mapping.BoundSql;
+import org.junit.jupiter.api.Test;
+
+import java.io.InputStream;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * 摊位审核 filter 的 MyBatis-Plus 渲染回归:线上运行时走 MybatisConfiguration/MybatisXMLMapperBuilder,
+ * 纯空白文本节点会被丢弃,静态 status != 0 与动态 AND 可能贴死成 0AND(2026-10-16 线上事故)。
+ * 原生 Configuration 的测试保留空白、无法暴露该问题,必须用 MP 解析链路验证。
+ */
+class StallQualificationMapperMpRenderTest {
+
+    @Test
+    void filterKeepsSeparatorUnderMybatisPlusParsing() throws Exception {
+        MybatisConfiguration configuration = new MybatisConfiguration();
+        String resource = "mapper/chanting/StallQualificationMapper.xml";
+        try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) {
+            assertNotNull(input);
+            new MybatisXMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse();
+        }
+        String namespace = "com.ruoyi.system.mapper.StallQualificationMapper.";
+        BoundSql select = configuration.getMappedStatement(namespace + "selectApplications")
+                .getBoundSql(Map.of("status", 1, "limit", 10, "offset", 0));
+        String collapsed = select.getSql().replaceAll("\\s+", " ");
+        assertFalse(collapsed.contains("0AND"), "MP 解析下静态与动态条件贴死: " + collapsed);
+        assertTrue(collapsed.contains("status != 0 AND status = ?"), "MP 解析下丢失分隔空白: " + collapsed);
+
+        BoundSql withStore = configuration.getMappedStatement(namespace + "selectApplications")
+                .getBoundSql(Map.of("status", 2, "storeId", 7L, "limit", 10, "offset", 0));
+        String collapsedStore = withStore.getSql().replaceAll("\\s+", " ");
+        assertFalse(collapsedStore.contains("?AND"), "MP 解析下动态条件之间贴死: " + collapsedStore);
+        assertTrue(collapsedStore.contains("AND store_id = ?"), collapsedStore);
+    }
+}