Condition增加构造方法支持BETWEEN(issue#4041@Github)

This commit is contained in:
Looly
2025-08-29 12:17:49 +08:00
parent 9b95074bb4
commit 6196b55ae9
2 changed files with 37 additions and 4 deletions

View File

@@ -24,6 +24,7 @@ import cn.hutool.v7.core.text.CharUtil;
import cn.hutool.v7.core.text.StrUtil; import cn.hutool.v7.core.text.StrUtil;
import cn.hutool.v7.core.text.split.SplitUtil; import cn.hutool.v7.core.text.split.SplitUtil;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@@ -35,6 +36,7 @@ import java.util.List;
* @author Looly * @author Looly
*/ */
public class Condition implements Cloneable, Serializable { public class Condition implements Cloneable, Serializable {
@Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
@@ -146,7 +148,12 @@ public class Condition implements Cloneable, Serializable {
} }
/** /**
* 构造 * 构造LIKE value条件支持
* <ul>
* <li>{@link LikeType#StartWith}LIKE value%</li>
* <li>{@link LikeType#EndWith}LIKE %value</li>
* <li>{@link LikeType#Contains}LIKE %value%</li>
* </ul>
* *
* @param field 字段 * @param field 字段
* @param value 值 * @param value 值
@@ -157,6 +164,21 @@ public class Condition implements Cloneable, Serializable {
this.operator = OPERATOR_LIKE; this.operator = OPERATOR_LIKE;
this.value = SqlUtil.buildLikeValue(value, likeType, false); this.value = SqlUtil.buildLikeValue(value, likeType, false);
} }
/**
* 构造BETWEEN leftValue and rightValue条件
*
* @param field 字段
* @param leftValue 左值
* @param rightValue 右值
* @since 5.8.41
*/
public Condition(final String field, final Object leftValue, final Object rightValue) {
this.field = field;
this.operator = OPERATOR_BETWEEN;
this.value = leftValue;
this.secondValue = rightValue;
}
// --------------------------------------------------------------- Constructor end // --------------------------------------------------------------- Constructor end
// --------------------------------------------------------------- Getters and Setters start // --------------------------------------------------------------- Getters and Setters start
@@ -400,7 +422,7 @@ public class Condition implements Cloneable, Serializable {
// 直接使用条件值 // 直接使用条件值
final String valueStr = String.valueOf(this.value); final String valueStr = String.valueOf(this.value);
conditionStrBuilder.append(" ").append(isOperatorLike() ? conditionStrBuilder.append(" ").append(isOperatorLike() ?
StrUtil.wrap(valueStr, "'") : valueStr); StrUtil.wrap(valueStr, "'") : valueStr);
} }
} }
@@ -534,7 +556,7 @@ public class Condition implements Cloneable, Serializable {
} }
// issue#I892T5 处理NOT IN // issue#I892T5 处理NOT IN
if(StrUtil.startWithIgnoreCase(valueStr, OPERATOR_NOT_IN)){ if (StrUtil.startWithIgnoreCase(valueStr, OPERATOR_NOT_IN)) {
this.operator = OPERATOR_NOT_IN; this.operator = OPERATOR_NOT_IN;
this.value = StrUtil.trim(StrUtil.subSuf(valueStr, OPERATOR_NOT_IN.length())); this.value = StrUtil.trim(StrUtil.subSuf(valueStr, OPERATOR_NOT_IN.length()));
return; return;
@@ -567,7 +589,7 @@ public class Condition implements Cloneable, Serializable {
// 处理BETWEEN x AND y // 处理BETWEEN x AND y
if (OPERATOR_BETWEEN.equals(firstPart)) { if (OPERATOR_BETWEEN.equals(firstPart)) {
final List<String> betweenValueStrs = SplitUtil.split(strs.get(1), LogicalOperator.AND.toString(), final List<String> betweenValueStrs = SplitUtil.split(strs.get(1), LogicalOperator.AND.toString(),
2, true, true, true); 2, true, true, true);
if (betweenValueStrs.size() < 2) { if (betweenValueStrs.size() < 2) {
// 必须满足a AND b格式不满足被当作普通值 // 必须满足a AND b格式不满足被当作普通值
return; return;

View File

@@ -16,10 +16,14 @@
package cn.hutool.v7.db.sql; package cn.hutool.v7.db.sql;
import cn.hutool.v7.core.date.DateTime;
import cn.hutool.v7.core.date.DateUtil;
import cn.hutool.v7.core.lang.Console;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -101,4 +105,11 @@ public class ConditionTest {
final Condition age = Condition.parse("age", "not in 1,2,3"); final Condition age = Condition.parse("age", "not in 1,2,3");
assertEquals("age NOT IN (?,?,?)", age.toString()); assertEquals("age NOT IN (?,?,?)", age.toString());
} }
@Test
void issue4041Test() {
final DateTime date = DateUtil.parse("2025-08-29");
final Condition createdDate = new Condition("createdDate", DateUtil.offsetDay(date, -3), DateUtil.offsetDay(date, -1));
assertEquals("createdDate BETWEEN ? AND ?", createdDate.toString());
}
} }