这个语句怎么写在JOOQ中?

How can this statement be written in JOOQ?

我有一个 table 有 ID varchar(255) 作为 PK。我设法创建了一个自动递增临时列 rowNumber 以与 SELECT 一起使用,如下所示:

SELECT
   (@cnt := @cnt + 1) AS rowNumber, ID  
  from table
  CROSS JOIN (SELECT @cnt := 0) AS n 
where 
  (
    some conditions
    )
  )
  and date > {ts '2020-08-06 08:51:23.08'}
  ORDER BY ID
  LIMIT 10
;

如何用JOOQ表达上面的查询?特别是 (@cnt := @cnt + 1) AS rowNumber 部分。

SQL jOOQ 中的变量支持

jOOQ 目前(3.13 版)不支持您所显示的会话变量。有一个待处理的功能请求:https://github.com/jOOQ/jOOQ/issues/2558

每当 jOOQ 不支持供应商特定功能时,您可以通过 plain SQL templating 使用它。写:

ctx
  .select(
    field("(@cnt := @cnt + 1)", SQLDataType.BIGINT).as("rowNumber"),
    TABLE.ID)
  .from(TABLE)
  .crossJoin(table(select(field("@cnt := 0", SQLDataType.BIGINT))).as("n"))
  .where(...)
  .orderBy(TABLE.ID)
  .limit(10)
  .fetch();

一如既往地假设这个静态导入:

import static org.jooq.impl.DSL.*;

从MySQL8开始

只是一个 side-note 供将来可能使用 MySQL 的访问者使用 8:在这些情况下,您将使用 DSL.rowNumber() window 函数而不是使用变量的方法