Как можно написать это утверждение в JOOQ? - PullRequest
1 голос
/ 07 августа 2020

У меня есть таблица, в которой 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.

1 Ответ

1 голос
/ 07 августа 2020

SQL поддержка переменных в jOOQ

В настоящее время jOOQ (версия 3.13) не поддерживает переменные сеанса, подобные тем, которые вы показали. Для этого есть ожидающий запрос функции: https://github.com/jOOQ/jOOQ/issues/2558

Если jOOQ не поддерживает функцию c, указанную поставщиком, вы можете использовать ее с помощью шаблонов plain SQL вместо этого. Напишите:

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

Предполагая, как всегда, эту статистику c import:

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

Начиная с MySQL 8

Просто примечание для будущие посетители, которые могут использовать MySQL 8: в этих случаях вы будете использовать оконную функцию DSL.rowNumber() вместо подхода с использованием переменных

...