diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/ConditionGroup.java b/hutool-db/src/main/java/cn/hutool/db/sql/ConditionGroup.java new file mode 100644 index 000000000..33467287a --- /dev/null +++ b/hutool-db/src/main/java/cn/hutool/db/sql/ConditionGroup.java @@ -0,0 +1,51 @@ +package cn.hutool.db.sql; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; + +import java.util.List; + +/** + * 条件组
+ * 用于构建复杂where条件 + * + * @author tjh + */ +public class ConditionGroup extends Condition{ + /** + * 条件列表 + */ + private Condition[] conditions; + + /** + * 追加条件 + * + * @param conditions 条件列表 + */ + public void addConditions(Condition... conditions) { + if(null == this.conditions) { + this.conditions = conditions; + } else { + this.conditions = ArrayUtil.addAll(this.conditions, conditions); + } + } + + /** + * 将条件组转换为条件字符串,使用括号包裹,并回填占位符对应的参数值 + * + * @param paramValues 参数列表,用于回填占位符对应参数值 + * @return 条件字符串 + */ + @Override + public String toString(List paramValues) { + if (ArrayUtil.isEmpty(conditions)) return StrUtil.EMPTY; + + final StringBuilder conditionStrBuilder = StrUtil.builder(); + conditionStrBuilder.append("("); + // 将组内的条件构造为SQL,因为toString,会进行递归,处理所有的条件组 + conditionStrBuilder.append(ConditionBuilder.of(this.conditions).build(paramValues)); + conditionStrBuilder.append(")"); + + return conditionStrBuilder.toString(); + } +} diff --git a/hutool-db/src/test/java/cn/hutool/db/sql/ConditionGroupTest.java b/hutool-db/src/test/java/cn/hutool/db/sql/ConditionGroupTest.java new file mode 100644 index 000000000..3c48c2218 --- /dev/null +++ b/hutool-db/src/test/java/cn/hutool/db/sql/ConditionGroupTest.java @@ -0,0 +1,26 @@ +package cn.hutool.db.sql; + +import org.junit.Test; + +public class ConditionGroupTest { + @Test + public void ConditionGroupToStringTest() { + Condition condition1 = new Condition("a", "A"); + Condition condition2 = new Condition("b", "B"); + condition2.setLinkOperator(LogicalOperator.OR); + Condition condition3 = new Condition("c", "C"); + Condition condition4 = new Condition("d", "D"); + + ConditionGroup cg = new ConditionGroup(); + cg.addConditions(condition1, condition2); + + // 条件组嵌套情况 + ConditionGroup cg2 = new ConditionGroup(); + cg2.addConditions(cg, condition3); + + final ConditionBuilder conditionBuilder = ConditionBuilder.of(cg2, condition4); + + System.out.println(conditionBuilder.build()); + System.out.println(conditionBuilder.getParamValues()); + } +}