From 0de248a039d8b0ffcc8da61ba2fe0e3f6f2aedc4 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Wed, 11 Mar 2026 10:06:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B5=81=E6=B0=B4=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E6=97=B6=E9=97=B4=E9=87=91=E9=A2=9D=E7=AD=9B=E9=80=89?= =?UTF-8?q?SQL=E9=97=AE=E9=A2=98=E3=80=8D}{?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ccdi/project/CcdiBankStatementMapper.xml | 8 +-- .../CcdiBankStatementMapperXmlTest.java | 68 +++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml index bc1b964..1c08370 100644 --- a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml +++ b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml @@ -156,7 +156,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND IFNULL(bs.AMOUNT_DR, 0) > 0 - AND = ]]> + AND () = ]]> CASE WHEN LENGTH(TRIM(#{query.transactionStartTime})) = 10 THEN STR_TO_DATE(CONCAT(TRIM(#{query.transactionStartTime}), ' 00:00:00'), '%Y-%m-%d %H:%i:%s') @@ -164,7 +164,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" END - AND + AND () CASE WHEN LENGTH(TRIM(#{query.transactionEndTime})) = 10 THEN STR_TO_DATE(CONCAT(TRIM(#{query.transactionEndTime}), ' 23:59:59'), '%Y-%m-%d %H:%i:%s') @@ -216,10 +216,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - AND = ]]> #{query.amountMin} + AND () = ]]> #{query.amountMin} - AND #{query.amountMax} + AND () #{query.amountMax} AND ( diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapperXmlTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapperXmlTest.java index ec8bae6..dca1f23 100644 --- a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapperXmlTest.java +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapperXmlTest.java @@ -69,6 +69,74 @@ class CcdiBankStatementMapperXmlTest { } } + @Test + void statementFilterWhere_shouldWrapIncludedCaseExpressionsToAvoidAndCaseCollision() throws Exception { + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(RESOURCE)) { + String xml = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); + + assertTrue(xml.contains("AND () = ]]>"), xml); + assertTrue(xml.contains("AND () "), xml); + assertTrue(xml.contains("AND () = ]]>"), xml); + assertTrue(xml.contains("AND () "), xml); + } + } + + @Test + void selectStatementPage_shouldKeepWhitespaceBeforeDateRangeExpressions() throws Exception { + MappedStatement mappedStatement = loadMappedStatement( + "com.ruoyi.ccdi.project.mapper.CcdiBankStatementMapper.selectStatementPage"); + CcdiBankStatementQueryDTO queryDTO = new CcdiBankStatementQueryDTO(); + queryDTO.setProjectId(33L); + queryDTO.setTransactionStartTime("2024-01-01 00:00:00"); + queryDTO.setTransactionEndTime("2024-01-31 23:59:59"); + + String sql = renderSql(mappedStatement, queryDTO); + + assertFalse(sql.contains("ANDCASE"), sql); + assertTrue(sql.contains("AND ( CASE WHEN bs.TRX_DATE"), sql); + assertTrue(sql.contains("END ) >="), sql); + assertTrue(sql.contains("END ) <="), sql); + } + + @Test + void selectStatementPage_shouldKeepWhitespaceBeforeAmountRangeExpressions() throws Exception { + MappedStatement mappedStatement = loadMappedStatement( + "com.ruoyi.ccdi.project.mapper.CcdiBankStatementMapper.selectStatementPage"); + CcdiBankStatementQueryDTO queryDTO = new CcdiBankStatementQueryDTO(); + queryDTO.setProjectId(33L); + queryDTO.setAmountMin(java.math.BigDecimal.ONE); + queryDTO.setAmountMax(new java.math.BigDecimal("100")); + + String sql = renderSql(mappedStatement, queryDTO); + + assertFalse(sql.contains("ANDCASE"), sql); + assertTrue(sql.contains("AND ( CASE WHEN IFNULL(bs.AMOUNT_CR, 0) > 0"), sql); + assertTrue(sql.contains("END ) >= ?"), sql); + assertTrue(sql.contains("END ) <= ?"), sql); + } + + private MappedStatement loadMappedStatement(String statementId) throws Exception { + Configuration configuration = new Configuration(); + configuration.setEnvironment(new Environment("test", new JdbcTransactionFactory(), new NoOpDataSource())); + registerTypeAliases(configuration.getTypeAliasRegistry()); + configuration.getLanguageRegistry().register(XMLLanguageDriver.class); + configuration.addMapper(CcdiBankStatementMapper.class); + + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(RESOURCE)) { + XMLMapperBuilder xmlMapperBuilder = + new XMLMapperBuilder(inputStream, configuration, RESOURCE, configuration.getSqlFragments()); + xmlMapperBuilder.parse(); + } + return configuration.getMappedStatement(statementId); + } + + private String renderSql(MappedStatement mappedStatement, CcdiBankStatementQueryDTO queryDTO) { + Map params = new HashMap<>(); + params.put("query", queryDTO); + BoundSql boundSql = mappedStatement.getBoundSql(params); + return boundSql.getSql().replaceAll("\\s+", " ").trim(); + } + private void registerTypeAliases(TypeAliasRegistry typeAliasRegistry) { typeAliasRegistry.registerAlias("map", Map.class); }