java 将jooq从3.14.6升级到3.17.5时LIMIT子句的变更

kpbpu008  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(92)

我正在尝试将Jooq从3.14.6升级到3.17.5。我发现两个版本生成的SQL不同
乔克3.14.6

SELECT 
  public.payment.request_id 
FROM 
  payment 
WHERE 
  payment.status_expire_at < cast(
    '2007-12-03 10:15:30+00:00' as timestamp(6) with time zone
  )
) 
order by 
  public.payment.status_expire_at ASC LIMIT 10;

在Jooq 3.17.5

SELECT 
  public.payment.request_id 
FROM 
  payment 
WHERE 
  payment.status_expire_at < cast(
    '2007-12-03 10:15:30+00:00' as timestamp(6) with time zone
  )
) 
order by 
  public.payment.status_expire_at ASC FETCH NEXT 10 ROWS ONLY;

谁能告诉我
1.如果在jooq codegen(版本3.17.5)中有任何设置,这将允许我有生成的SQL与3.14.6相同?
1.是否有文档链接总结了Jooq版本从3.14.6到3.175生成的SQL中的所有更改?
DB -波斯格雷

xdnvmnnf

xdnvmnnf1#

旧PostgreSQL版本支持

您可能使用的是旧版本的PostgreSQL,它还不支持标准的SQL FETCH子句。请参考support matrix以了解哪个jOOQ版本(和版本)支持哪个PostgreSQL版本。商业版本仍然支持许多旧的PostgreSQL版本。

您的具体问题:

如果在jooq codegen(版本3.17.5)中有任何设置,这将允许我有生成的SQL与3.14.6相同?
不,除了SQLDialect之外,没有针对此特定语法的配置,SQLDialect针对每个受支持的PostgreSQL版本进行了集成测试。
是否有文档链接总结了Jooq版本从3.14.6到3.175生成的SQL中的所有更改?
是的,release notesissue tracker。这个特殊的变化可能是在jOOQ3.15中引入的,支持PostgreSQL 13:

特别是,原生PostgreSQL FETCH FIRST .. WITH TIES支持可能触发了此更改。

可能的解决方案:

  • 您可以继续使用jOOQ3.14.x,其中jOOQOpenSourceEdition(假设您使用的是它)还不支持PostgreSQL 13和此语法
  • 您可以升级到商业jOOQ版本,该版本仍支持PostgreSQL 12及更低版本
  • 您可以将PostgreSQL升级到更新版本
  • 您可以在ExecuteListener中使用正则表达式修补生成的SQL字符串:搜索FETCH NEXT (\?|\d+) ROWS ONLY并替换为LIMIT $1。注意,虽然它是OFFSET .. FETCH,但它是LIMIT .. OFFSET,所以如果你想使用这种方法,请注意也必须反转绑定值的顺序。这更像是一种黑客攻击,当然,其他选项要好得多。

相关问题