support NOT IN

This commit is contained in:
Looly 2023-10-18 18:51:20 +08:00
parent db0c9dd497
commit c3b8f8daaa
2 changed files with 29 additions and 4 deletions

View File

@ -12,13 +12,13 @@
package org.dromara.hutool.db.sql; package org.dromara.hutool.db.sql;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.convert.Convert; import org.dromara.hutool.core.convert.Convert;
import org.dromara.hutool.core.exception.CloneException; import org.dromara.hutool.core.exception.CloneException;
import org.dromara.hutool.core.math.NumberUtil; import org.dromara.hutool.core.math.NumberUtil;
import org.dromara.hutool.core.text.CharUtil;
import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.text.split.SplitUtil; import org.dromara.hutool.core.text.split.SplitUtil;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.text.CharUtil;
import java.io.Serializable; import java.io.Serializable;
import java.util.Arrays; import java.util.Arrays;
@ -55,6 +55,7 @@ public class Condition implements Cloneable, Serializable {
private static final String OPERATOR_LIKE = "LIKE"; private static final String OPERATOR_LIKE = "LIKE";
private static final String OPERATOR_IN = "IN"; private static final String OPERATOR_IN = "IN";
private static final String OPERATOR_NOT_IN = "NOT IN";
private static final String OPERATOR_IS = "IS"; private static final String OPERATOR_IS = "IS";
private static final String OPERATOR_IS_NOT = "IS NOT"; private static final String OPERATOR_IS_NOT = "IS NOT";
private static final String OPERATOR_BETWEEN = "BETWEEN"; private static final String OPERATOR_BETWEEN = "BETWEEN";
@ -261,6 +262,15 @@ public class Condition implements Cloneable, Serializable {
return OPERATOR_IN.equalsIgnoreCase(this.operator); return OPERATOR_IN.equalsIgnoreCase(this.operator);
} }
/**
* 是否NOT IN条件
*
* @return 是否NOT IN条件
*/
public boolean isOperatorNotIn() {
return OPERATOR_NOT_IN.equalsIgnoreCase(this.operator);
}
/** /**
* 是否IS条件 * 是否IS条件
* *
@ -355,7 +365,7 @@ public class Condition implements Cloneable, Serializable {
if (isOperatorBetween()) { if (isOperatorBetween()) {
buildValuePartForBETWEEN(conditionStrBuilder, paramValues); buildValuePartForBETWEEN(conditionStrBuilder, paramValues);
} else if (isOperatorIn()) { } else if (isOperatorIn() || isOperatorNotIn()) {
// 类似" (?,?,?)" 或者 " (1,2,3,4)" // 类似" (?,?,?)" 或者 " (1,2,3,4)"
buildValuePartForIN(conditionStrBuilder, paramValues); buildValuePartForIN(conditionStrBuilder, paramValues);
} else { } else {
@ -502,13 +512,22 @@ public class Condition implements Cloneable, Serializable {
} }
} }
final List<String> strs = SplitUtil.split(valueStr, StrUtil.SPACE, 2, true, false); final List<String> strs = SplitUtil.split(valueStr, StrUtil.SPACE, 3, true, false);
if (strs.size() < 2) { if (strs.size() < 2) {
// 无空格按照普通值对待
return; return;
} }
// 处理常用符号和IN // 处理常用符号和IN
final String firstPart = strs.get(0).toUpperCase(); final String firstPart = strs.get(0).toUpperCase();
// issue#I892T5 处理NOT IN
if("NOT".equals(firstPart) && OPERATOR_IN.equalsIgnoreCase(strs.get(1))){
this.operator = OPERATOR_NOT_IN;
this.value = strs.get(2);
return;
}
if (OPERATORS.contains(firstPart)) { if (OPERATORS.contains(firstPart)) {
this.operator = firstPart; this.operator = firstPart;
// 比较符号后跟大部分为数字此处做转换IN不做转换 // 比较符号后跟大部分为数字此处做转换IN不做转换

View File

@ -80,4 +80,10 @@ public class ConditionTest {
final Condition age = Condition.parse("age", "in 1,2,3"); final Condition age = Condition.parse("age", "in 1,2,3");
Assertions.assertEquals("age IN (?,?,?)", age.toString()); Assertions.assertEquals("age IN (?,?,?)", age.toString());
} }
@Test
void notInTest() {
final Condition age = Condition.parse("age", "not in 1,2,3");
Assertions.assertEquals("age NOT IN (?,?,?)", age.toString());
}
} }