jooq 可以识别例程的可选参数并相应地创建重载吗?
Can jooq recognize optional parameters for routines and create overloads accordingly?
我们在 Kotlin/Java 环境中使用 jooq 来访问 timescaledb。现在,通常当我们重新生成 jooq 对象时,如果 db 上例程的签名发生了变化,即使它只是添加了可选参数,我们也会出错。我能否以某种方式让 jooq 生成相应方法的重载以避免必须手动填写可选参数的默认值?
谢谢!
您可以扩展您用于生成代码的 org.jooq.meta.Database
class,以便从每个代码生成 运行 中生成额外的 RoutineDefinition
个实例。你需要的所有信息都在那里,你只需要做这样的事情(我没试过,可能有错误,随意编辑):
public class MyDatabase extends PostgresDatabase {
@Override
protected List<RoutineDefinition> getRoutines0() throws SQLException {
List<RoutineDefinition> routines = super.getRoutines0();
List<RoutineDefinition> result = new ArrayList<>(routines);
routineLoop:
for (RoutineDefinition routine : routines) {
if (routine.isSQLUsable()) {
List<ParameterDefinition> in = new ArrayList<>(routine.getInParameters());
Iterator<ParameterDefinition> it = in.iterator();
boolean hasDefaulted = false;
while (it.hasNext())
if (it.next().isDefaulted()) {
hasDefaulted = true;
it.remove();
}
// This approach only works if the trailing params are defaulted
else if (hasDefaulted)
continue routineLoop;
if (hasDefaulted)
result.add(new AbstractRoutineDefinition(
routine.getSchema(), null, routine.getName(),
routine.getComment(), "OverloadIndex" // Replace this
) {
@Override
protected void init0() {
addParameter(InOutDefinition.RETURN, routine.getReturnValue());
for (ParameterDefinition p : in)
addParameter(InOutDefinition.IN, p);
}
});
}
}
return result;
}
}
我们在 Kotlin/Java 环境中使用 jooq 来访问 timescaledb。现在,通常当我们重新生成 jooq 对象时,如果 db 上例程的签名发生了变化,即使它只是添加了可选参数,我们也会出错。我能否以某种方式让 jooq 生成相应方法的重载以避免必须手动填写可选参数的默认值?
谢谢!
您可以扩展您用于生成代码的 org.jooq.meta.Database
class,以便从每个代码生成 运行 中生成额外的 RoutineDefinition
个实例。你需要的所有信息都在那里,你只需要做这样的事情(我没试过,可能有错误,随意编辑):
public class MyDatabase extends PostgresDatabase {
@Override
protected List<RoutineDefinition> getRoutines0() throws SQLException {
List<RoutineDefinition> routines = super.getRoutines0();
List<RoutineDefinition> result = new ArrayList<>(routines);
routineLoop:
for (RoutineDefinition routine : routines) {
if (routine.isSQLUsable()) {
List<ParameterDefinition> in = new ArrayList<>(routine.getInParameters());
Iterator<ParameterDefinition> it = in.iterator();
boolean hasDefaulted = false;
while (it.hasNext())
if (it.next().isDefaulted()) {
hasDefaulted = true;
it.remove();
}
// This approach only works if the trailing params are defaulted
else if (hasDefaulted)
continue routineLoop;
if (hasDefaulted)
result.add(new AbstractRoutineDefinition(
routine.getSchema(), null, routine.getName(),
routine.getComment(), "OverloadIndex" // Replace this
) {
@Override
protected void init0() {
addParameter(InOutDefinition.RETURN, routine.getReturnValue());
for (ParameterDefinition p : in)
addParameter(InOutDefinition.IN, p);
}
});
}
}
return result;
}
}