我们在 Kotlin/Java 环境中使用 jooq 来访问 timescaledb。现在,通常当我们重新生成 jooq 对象时,如果 db 上例程的签名发生了变化,即使它只是添加了可选参数,我们也会出错。我能否以某种方式让 jooq 生成相应方法的重载,以避免必须手动填写可选参数的默认值?

谢谢!

请您参考如下方法:

您可以扩展用于生成代码的 org.jooq.meta.Database 类,以便从每次代码生成运行中生成额外的 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; 
    } 
} 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!