如何添加分号;使用 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
?
我正在尝试向每个 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
?