java - 如何将 Oracle 的 APPEND 提示与 JOOQ 渲染的 INSERT 语句一起使用?

标签 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 在上述查询中注入(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/

相关文章:

MySQL触发器在插入时删除和创建表(通过mysqlimport)

java - JOOQ mysql按位

java - 限制和偏移的jooq问题

java - 使用 @JsonPropperty 提取具有相同前缀的键的值列表

java - 有没有办法将监听器添加到执行者/ future 的?

java - 我想检查用户第一个输入的首字母是否类似于第二个用户输入的首字母

java - 如何使用Hibernate-Search在ElasticSearch中将Set <Entity>序列化为字符串数组?

delphi - 存储过程插入问题

php - MySQL 错误号 : 1064 when INSERTING to Database

java - sql语句在集成测试结束前回滚