mirror of
https://gitee.com/dromara/hutool.git
synced 2025-11-24 16:43:24 +08:00
Condition增加构造方法支持BETWEEN(issue#4041@Github)
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user