如何添加分号;使用 jOOQ 自动生成每个 sql 语句

How to add a semi colon ; automatically to each generated sql statement using jOOQ

我正在尝试向每个 jOOQ 生成的 sql 语句添加分号 ;,因为我正在将多个 DDL 和插入语句写入输出文件。

我在这里发现了一个类似的问题,建议在此处使用 ExecuteListener https://jooq-user.narkive.com/6adKecpt/adding-semicolon-at-the-end-of-sql-statement

我现在的设置如下(使用 Groovy):

    private DSLContext createDSLContext() {
        def configuration = new DefaultConfiguration()
        configuration.settings = new Settings()
                .withRenderFormatted(true)
                .withRenderKeywordCase(RenderKeywordCase.LOWER)
                .withRenderQuotedNames(RenderQuotedNames.ALWAYS)
                .withStatementType(StatementType.STATIC_STATEMENT)
        configuration.set(
                new DefaultExecuteListenerProvider(new DefaultExecuteListener() {
                    @Override
                    void renderEnd(ExecuteContext ctx) {
                        ctx.sql(ctx.sql() + ";")
                    }
                }),
                new DefaultExecuteListenerProvider(new DefaultExecuteListener() {
                    @Override
                    void start(ExecuteContext ctx) {
                        println "YEAH!!!"
                    }
                }))
        // return configuration.dsl();
        return DSL.using(configuration)
    }

但没有添加分号,也根本没有进入 renderEnd 方法。 我添加了另一个执行侦听器以在开始时打印一些内容(正如我在其他示例中看到的那样)但它也从未被调用过..

我的代码如下:

        file.withWriter { writer ->

            // Drop schema objects.

            DEFAULT_SCHEMA.tables.each {
                switch (it.type) {
                    case TABLE:
                        writer.writeLine(dsl.dropTableIfExists(it).SQL)
                        break
                    case VIEW:
                        writer.writeLine(dsl.dropViewIfExists(it).SQL)
                        break
                }
            }
            writer.writeLine("")

            // Create schema objects.

            def ddlStatements = dsl.ddl(DEFAULT_SCHEMA)
            ddlStatements.each {
                writer.writeLine(it.SQL)
                writer.writeLine("")
            }

            // Insert data.

            def insert = dsl.insertInto(Tales.CUSTOMER).columns(Tales.CUSTOMER.fields())
            customers.each {insert.values(it) }
            writer.writeLine(insert.SQL)

        }

ExecuteListener 生命周期仅在您使用 jOOQ 执行 查询时触发。你没有那样做,你只是在调用 Query.getSQL()

您可以将查询包装到 DSLContext.queries(Query...), and jOOQ will separate the statements using ; when you call Queries.getSQL() when you call Queries.toString(). Of course, that's not reliable, the behaviour of toString() might change in the future, which is why it would make sense to offer methods like Queries.getSQL() and the likes: https://github.com/jOOQ/jOOQ/issues/11755

目前,为什么不直接将分号手动添加到代码中的 writer