From 32a5ff53b640ee1f4659c91fc9028edeb5db42a2 Mon Sep 17 00:00:00 2001 From: zwm <2076229520@qq.com> Date: Fri, 29 Aug 2025 02:36:01 +0800 Subject: [PATCH] Fix issue 4040 --- .../main/java/cn/hutool/db/sql/Condition.java | 27 +++++++++++++++---- .../java/cn/hutool/db/sql/ConditionTest.java | 9 +++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java b/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java index cfbfcc251d..c87b5d406b 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java @@ -257,6 +257,17 @@ public class Condition extends CloneSupport { return OPERATOR_IS.equalsIgnoreCase(this.operator); } + /** + * 是否 IS NOT条件 + * + * @return 是否IS NOT条件 + * @since 5.8.0 + */ + public boolean isOperatorIsNot() { + return OPERATOR_IS_NOT.equalsIgnoreCase(this.operator); + } + + /** * 是否LIKE条件 * @@ -268,18 +279,24 @@ public class Condition extends CloneSupport { } /** - * 检查值是否为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; } + /** * 获得between 类型中第二个值 * @@ -345,8 +362,8 @@ public class Condition extends CloneSupport { // 类似:" (?,?,?)" 或者 " (1,2,3,4)" buildValuePartForIN(conditionStrBuilder, paramValues); } else { - if (isPlaceHolder() && false == isOperatorIs()) { - // 使用条件表达式占位符,条件表达式并不适用于 IS NULL + if (isPlaceHolder() && !isOperatorIs() && !isOperatorIsNot()) { + // 使用条件表达式占位符,条件表达式并不适用于 IS NULL 和 IS NOT NULL conditionStrBuilder.append(" ?"); if (null != paramValues) { paramValues.add(this.value); @@ -355,7 +372,7 @@ public class Condition extends CloneSupport { // 直接使用条件值 final String valueStr = String.valueOf(this.value); conditionStrBuilder.append(" ").append(isOperatorLike() ? - StrUtil.wrap(valueStr, "'") : valueStr); + StrUtil.wrap(valueStr, "'") : valueStr); } } diff --git a/hutool-db/src/test/java/cn/hutool/db/sql/ConditionTest.java b/hutool-db/src/test/java/cn/hutool/db/sql/ConditionTest.java index 2b71081708..fbf5064206 100644 --- a/hutool-db/src/test/java/cn/hutool/db/sql/ConditionTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/sql/ConditionTest.java @@ -12,9 +12,18 @@ public class ConditionTest { Condition conditionNull = new Condition("user", null); assertEquals("user IS NULL", conditionNull.toString()); + Condition conditionNull2 = new Condition("user", "=", (String) null); + assertEquals("user IS NULL", conditionNull2.toString()); + Condition conditionNotNull = new Condition("user", "!= null"); assertEquals("user IS NOT NULL", conditionNotNull.toString()); + Condition conditionNotNull2 = new Condition("user", "!=", (String) null); + assertEquals("user IS NOT NULL", conditionNotNull2.toString()); + + Condition conditionNotNull3 = new Condition("user", "<>", (String) null); + assertEquals("user IS NOT NULL", conditionNotNull3.toString()); + Condition condition2 = new Condition("user", "= zhangsan"); assertEquals("user = ?", condition2.toString());