TRUE和FALSE条件
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
当条件表达式是强制性的,或者当使用动态 SQL时,可能需要提供一个始终评估为 TRUE
或 FALSE
的“虚拟”条件。为此,您可以使用 DSL.trueCondition()
,DSL.falseCondition()
或 DSL.noCondition()
。 例如
TRUE
TRUE
是 AND
布尔运算符的恒等值,可用于将一组值程序或函数式地缩减为条件
TRUE AND ID = 1 AND TITLE = 'Animal Farm'
Condition condition = trueCondition(); if (id != null) condition = condition.and(BOOK.ID.eq(id)); if (title != null) condition = condition.and(BOOK.TITLE.eq(title));
FALSE OR ID = 1 OR ID = 7
List<Integer> list = List.of(1, 7); Condition condition = list .stream() .map(BOOK.ID::eq) .reduce(falseCondition(), Condition::or)
如果方言不支持布尔列类型,则 jOOQ 将简单地生成 1 = 0
。
NO 条件
如果您认为从上述缩减生成的“剩余”恒等值很难看,则可以使用辅助 DSL.noCondition()
,它充当 AND
和 OR
的伪恒等值,不生成任何 SQL,除非缩减产生任何内容(来自空集),在这种情况下,它的行为类似于 TRUE
,这通常是您在 WHERE
子句中放置动态条件时所希望的。
如果与实际数据一起使用
ID = 1 OR ID = 7
List<Integer> list = List.of(1, 7); Condition condition = list.stream().map(BOOK.ID::eq) .reduce(noCondition(), Condition::or)
如果与空集一起使用
TRUE
List<Integer> list = List.of(1, 7); Condition condition = list.stream().map(BOOK.ID::eq) .reduce(noCondition(), Condition::or)
有关 noCondition()
和相关主题的一些其他信息可以在关于动态 SQL的部分中找到。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!