From 9b95074bb4fa7144d6e2bbf38699d5009d34635a Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 29 Aug 2025 12:02:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Condition`=E7=9A=84`Conditio?= =?UTF-8?q?n("discount=5Fend=5Ftime",=20"!=3D",=20(String)=20null)`?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E7=94=9F=E6=88=90SQL=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E7=94=9F=E6=88=90SQL=E4=B8=8D=E7=AC=A6=E5=90=88=E9=A2=84?= =?UTF-8?q?=E6=9C=9F=E8=A6=81=E6=B1=82=E7=9A=84=E9=94=99=E8=AF=AF=EF=BC=88?= =?UTF-8?q?pr#4042@Github=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/v7/db/sql/Condition.java | 23 +++++++++-- .../cn/hutool/v7/db/sql/ConditionTest.java | 41 ++++++++++++------- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/hutool-db/src/main/java/cn/hutool/v7/db/sql/Condition.java b/hutool-db/src/main/java/cn/hutool/v7/db/sql/Condition.java index cddb59c160..d5d2c9d51e 100644 --- a/hutool-db/src/main/java/cn/hutool/v7/db/sql/Condition.java +++ b/hutool-db/src/main/java/cn/hutool/v7/db/sql/Condition.java @@ -285,6 +285,16 @@ public class Condition implements Cloneable, Serializable { return OPERATOR_IS.equalsIgnoreCase(this.operator); } + /** + * 是否 IS NOT条件 + * + * @return 是否IS NOT条件 + * @since 5.8.41 + */ + public boolean isOperatorIsNot() { + return OPERATOR_IS_NOT.equalsIgnoreCase(this.operator); + } + /** * 是否LIKE条件 * @@ -296,13 +306,18 @@ public class Condition implements Cloneable, Serializable { } /** - * 检查值是否为null,如果为null转换为 "IS NULL"形式 + * 检查值是否为null,如果为null转换为 "IS NULL"或"IS NOT NULL"形式 * * @return this */ public Condition checkValueNull() { if (null == this.value) { - this.operator = OPERATOR_IS; + // 检查是否为"不等于"操作符(包括!=和<>) + if ("!=".equalsIgnoreCase(this.operator) || "<>".equalsIgnoreCase(this.operator)) { + this.operator = OPERATOR_IS_NOT; + } else { + this.operator = OPERATOR_IS; + } this.value = VALUE_NULL; } return this; @@ -375,8 +390,8 @@ public class Condition implements Cloneable, Serializable { // 类似:" (?,?,?)" 或者 " (1,2,3,4)" buildValuePartForIN(conditionStrBuilder, paramValues); } else { - if (isPlaceHolder() && !isOperatorIs()) { - // 使用条件表达式占位符,条件表达式并不适用于 IS NULL + if (isPlaceHolder() && !isOperatorIs() && !isOperatorIsNot()) { + // 使用条件表达式占位符,条件表达式并不适用于 IS NULL和 IS NOT NULL conditionStrBuilder.append(" ?"); if (null != paramValues) { paramValues.add(this.value); diff --git a/hutool-db/src/test/java/cn/hutool/v7/db/sql/ConditionTest.java b/hutool-db/src/test/java/cn/hutool/v7/db/sql/ConditionTest.java index ce4050657e..c742381c6e 100644 --- a/hutool-db/src/test/java/cn/hutool/v7/db/sql/ConditionTest.java +++ b/hutool-db/src/test/java/cn/hutool/v7/db/sql/ConditionTest.java @@ -21,60 +21,71 @@ import org.junit.jupiter.api.Test; import java.math.BigDecimal; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class ConditionTest { @Test public void toStringTest() { final Condition conditionNull = new Condition("user", null); - Assertions.assertEquals("user IS NULL", conditionNull.toString()); + assertEquals("user IS NULL", conditionNull.toString()); + + final Condition conditionNull2 = new Condition("user", "=", (String) null); + assertEquals("user IS NULL", conditionNull2.toString()); final Condition conditionNotNull = new Condition("user", "!= null"); - Assertions.assertEquals("user IS NOT NULL", conditionNotNull.toString()); + assertEquals("user IS NOT NULL", conditionNotNull.toString()); + + final Condition conditionNotNull2 = new Condition("user", "!=", (String) null); + assertEquals("user IS NOT NULL", conditionNotNull2.toString()); + + final Condition conditionNotNull3 = new Condition("user", "<>", (String) null); + assertEquals("user IS NOT NULL", conditionNotNull3.toString()); final Condition condition2 = new Condition("user", "= zhangsan"); - Assertions.assertEquals("user = ?", condition2.toString()); + assertEquals("user = ?", condition2.toString()); final Condition conditionLike = new Condition("user", "like %aaa"); - Assertions.assertEquals("user LIKE ?", conditionLike.toString()); + assertEquals("user LIKE ?", conditionLike.toString()); final Condition conditionIn = new Condition("user", "in 1,2,3"); - Assertions.assertEquals("user IN (?,?,?)", conditionIn.toString()); + assertEquals("user IN (?,?,?)", conditionIn.toString()); final Condition conditionBetween = new Condition("user", "between 12 and 13"); - Assertions.assertEquals("user BETWEEN ? AND ?", conditionBetween.toString()); + assertEquals("user BETWEEN ? AND ?", conditionBetween.toString()); } @Test public void toStringNoPlaceHolderTest() { final Condition conditionNull = new Condition("user", null); conditionNull.setPlaceHolder(false); - Assertions.assertEquals("user IS NULL", conditionNull.toString()); + assertEquals("user IS NULL", conditionNull.toString()); final Condition conditionNotNull = new Condition("user", "!= null"); conditionNotNull.setPlaceHolder(false); - Assertions.assertEquals("user IS NOT NULL", conditionNotNull.toString()); + assertEquals("user IS NOT NULL", conditionNotNull.toString()); final Condition conditionEquals = new Condition("user", "= zhangsan"); conditionEquals.setPlaceHolder(false); - Assertions.assertEquals("user = zhangsan", conditionEquals.toString()); + assertEquals("user = zhangsan", conditionEquals.toString()); final Condition conditionLike = new Condition("user", "like %aaa"); conditionLike.setPlaceHolder(false); - Assertions.assertEquals("user LIKE '%aaa'", conditionLike.toString()); + assertEquals("user LIKE '%aaa'", conditionLike.toString()); final Condition conditionIn = new Condition("user", "in 1,2,3"); conditionIn.setPlaceHolder(false); - Assertions.assertEquals("user IN (1,2,3)", conditionIn.toString()); + assertEquals("user IN (1,2,3)", conditionIn.toString()); final Condition conditionBetween = new Condition("user", "between 12 and 13"); conditionBetween.setPlaceHolder(false); - Assertions.assertEquals("user BETWEEN 12 AND 13", conditionBetween.toString()); + assertEquals("user BETWEEN 12 AND 13", conditionBetween.toString()); } @Test public void parseTest(){ final Condition age = Condition.parse("age", "< 10"); - Assertions.assertEquals("age < ?", age.toString()); + assertEquals("age < ?", age.toString()); // issue I38LTM Assertions.assertSame(BigDecimal.class, age.getValue().getClass()); } @@ -82,12 +93,12 @@ public class ConditionTest { @Test public void parseInTest(){ final Condition age = Condition.parse("age", "in 1,2,3"); - Assertions.assertEquals("age IN (?,?,?)", age.toString()); + 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()); + assertEquals("age NOT IN (?,?,?)", age.toString()); } }