【问题标题】:How to add a semi colon ; automatically to each generated sql statement using jOOQ如何添加分号;使用 jOOQ 自动生成每个生成的 sql 语句
【发布时间】:2021-07-01 16:43:27
【问题描述】:

我正在尝试在每个 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)

        }

【问题讨论】:

    标签: sql jooq


    【解决方案1】:

    ExecuteListener 生命周期仅在您执行 jOOQ 查询时触发。你没有这样做,你只是打电话给Query.getSQL()

    您可以将查询包装到DSLContext.queries(Query...) 中,当您调用Queries.getSQL() 时,jOOQ 将在您调用Queries.toString() 时使用; 分隔语句。当然,这并不可靠,toString() 的行为将来可能会发生变化,这就是为什么提供像 Queries.getSQL() 这样的方法是有意义的:https://github.com/jOOQ/jOOQ/issues/11755

    暂时,为什么不在代码中手动将分号添加到writer

    【讨论】:

    • 是的,这是我目前的替代方案,请手动添加分号。因为我必须在多个地方做这件事——我忘了​​一个;-)——我看了看 jOOQ 是否可以这样做,然后我读到了ExecuteListener 。我现在明白它只用于使用 jOOQ 执行查询的地方。谢谢!
    猜你喜欢
    • 2021-01-11
    • 1970-01-01
    • 2016-07-22
    • 2014-06-08
    • 2014-02-06
    • 1970-01-01
    • 2023-03-15
    • 2017-08-06
    • 2012-04-07
    相关资源
    最近更新 更多