我有一个如下所示的 JOOQ 查询:
dsl.insertInto(AUTHOR_ARCHIVE)
.select(selectFrom(AUTHOR).where(AUTHOR.DECEASED.isTrue()));
我想利用Oracle's /*+ APPEND */
hint以提高性能。
但是,JOOQ's documentation on oracle hints不包含 INSERT
语句的示例。如何使用 JOOQ 3.8 在上述查询中注入(inject)追加提示?
最佳答案
jOOQ 当前不支持 DML 提示,但已在路线图中:https://github.com/jOOQ/jOOQ/issues/2654
与此同时,您的选择是:
求助于 plain SQL
例如通过 DSLContext.execute(String)
。通常,您可以通过 Query.getSQL()
从 jOOQ Query
中提取 SQL。和 Query.getBindValues()
。例如:
Query query = ctx.insertInto(...).values(...);
ctx.execute(
query.getSQL().replace("insert into", "insert /*+APPEND*/ into"),
query.getBindValues().toArray()
);
自己实现 DML 提示支持
通过 ExecuteListener
它修补 renderEnd()
上生成的 SQL每当某个标志设置为 true 时发生事件。您可以将标志放入 Configuration.data()
,例如:
public class MyListener extends DefaultExecuteListener {
@Override
public void renderEnd(ExecuteContext ctx) {
if (ctx.data().containsKey("insert hint")) {
ctx.sql(ctx.sql().replace(
"insert into",
"insert " + ctx.data().get("insert hint") + " into"
));
}
}
}
然后:
Configuration withHint = usualConfiguration.derive();
withHint.data("insert hint", "/*+APPEND*/");
DSL.using(withHint)
.insertInto(...).values(...).execute();
关于java - 如何将 Oracle 的 APPEND 提示与 JOOQ 渲染的 INSERT 语句一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37276221/