如何在JOOQ渲染的INSERT语句中使用Oracle的APPEND提示?

时间:2016-05-17 12:28:33

标签: java sql-insert jooq

我有一个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在上述查询中注入追加提示?

1 个答案:

答案 0 :(得分:1)

jOOQ目前不支持DML的提示,但是在路线图上:https://github.com/jOOQ/jOOQ/issues/2654

与此同时,您的选择是:

诉诸plain SQL

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()
);

自己实施DML提示支持

通过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();