我正在使用 jOOQ 并希望使用 DSL 构建动态
CASE WHEN
表达式。期望的结果是这样的结构:
var myCase = DSL.case_()
.when(condition1, result1)
.when(condition2, result2)
// ... additional WHEN clauses
.else_(defaultValue);
但是,使用循环和后续
.when
调用的简单方法会遇到问题。由于 DSL.case_()
的返回类型在第一个 .when
之后发生变化,因此有必要添加像 DSL.falseCondition()
这样的虚拟初始条件。下面的代码可以工作,但感觉很笨拙:
var myCase = DSL.case_()
.when(DSL.falseCondition(), null); // Hack to change myCase's type
for (var entry:conditions)
myCase.when( entry.getKey(), entry.getValue() )
return myCase.else_(defaultValue)
有没有办法避免这种黑客行为并使用 DSL 在 jOOQ 中构建动态
CASE WHEN
表达式?
这样做:
if (conditions.isEmpty())
return defaultValue;
CaseConditionStep<T> c = null;
for (var entry : conditions)
c = c == null
? DSL.when(entry.getKey(), getValue())
: c.when(entry.getKey(), getValue());
return c.else_(defaultValue);