这个语句怎么写在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 函数而不是使用变量的方法
我有一个 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 函数而不是使用变量的方法