我有一个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在上述查询中注入追加提示?
答案 0 :(得分:1)
jOOQ目前不支持DML的提示,但是在路线图上:https://github.com/jOOQ/jOOQ/issues/2654
与此同时,您的选择是:
e.g。通过DSLContext.execute(String)
。通常,您将通过Query.getSQL()
和Query.getBindValues()
从jOOQ Query
中提取SQL。例如:
Query query = ctx.insertInto(...).values(...);
ctx.execute(
query.getSQL().replace("insert into", "insert /*+APPEND*/ into"),
query.getBindValues().toArray()
);
通过ExecuteListener
,只要某个标志设置为true,就会在renderEnd()
事件上修补生成的SQL。您可以在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();