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);
}