jOOQ - 使用 DSL 构建动态“CASE WHEN”

问题描述 投票:0回答:1

我正在使用 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
表达式?

java dynamic-sql jooq
1个回答
0
投票

这样做:

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);
© www.soinside.com 2019 - 2024. All rights reserved.