【问题标题】:How to set a @Variable in JOOQ如何在 JOOQ 中设置 @Variable
【发布时间】:2018-04-02 19:03:06
【问题描述】:

我如何通过JOOQ 使用@variables? (或者是否有更简单的可能性来显示行号?-请注意,我需要将所选数据插入另一个表,并且 row_number 应始终从 0 开始!)

SET @row_number = 0;

SELECT 
    (@row_number:=@row_number + 1) AS NUM, FIRST_NAME, LAST_NAME
FROM
    AUTHOR
LIMIT 5;

这就是我认为JOOQcode 的样子...

Field<Integer> num = DSL.field("@row_number:=@row_number +1", Integer.class);
DSLContext create = DSL.using(connection, dialect);
create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, num)
      .from(AUTHOR)
      .limit(5)
      .fetch();

我需要执行那个吗

SET @row_number = 0;

用普通的JDBC ?

我在 StackOverflow 上找到了关于变量和 JOOQ 的东西 - how can we have variable in jooq

编辑:我进行了更多调查,并了解到这个“解决方案”的结果可能会在未来的版本中发生变化。我考虑将其更改为创建一个具有 pk 标识(从 0 开始)的临时表,然后我得到相同的结果,但没有设置和更新用户变量。

【问题讨论】:

    标签: java jooq


    【解决方案1】:

    正如您所注意到的,jOOQ 目前并不严格支持您的语法,因此您必须使用 jOOQ API 提供的普通 SQL 模板机制: https://www.jooq.org/doc/latest/manual/sql-building/plain-sql-templating

    您已经为查询本身正确地做到了这一点。现在关于初始化变量,理想情况下这是在同一个 JDBC 语句中完成,而不是在单独的语句中完成,以防止 jOOQ 在连续执行之间关闭 JDBC 连接引起的副作用(例如,当使用 DataSourceConnectionProvider 时)。因此,使用 jOOQ 最直接的方法是使用 ExecuteListener 将初始化 SQL 字符串附加到该特定语句之前,例如

    class InitialisingVariableListener extends DefaultExecuteListener {
        @Override
        public void renderEnd(ExecuteContext ctx) {
            ctx.sql("SET @row_number = 0;" + ctx.sql());
        }
    }
    

    并在执行查询之前将其与您的 Configuration 挂钩:

    Field<Integer> num = DSL.field("@row_number:=@row_number +1", Integer.class);
    DSLContext create = DSL.using(connection, dialect);
    create.configuration().set(new InitialisingVariableListener());
    create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, num)
          .from(AUTHOR)
          .limit(5)
          .fetch();
    

    如果您在多个查询中重复使用Configuration,您可能希望更愿意在其上调用derive() 来创建一个新的Configuration,而不是set(),这会为每个人修改Configuration

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 2013-08-30
      • 2019-10-02
      • 2019-11-12
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      相关资源
      最近更新 更多