我正在尝试将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 -波斯格雷
1条答案
按热度按时间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 notes或issue tracker。这个特殊的变化可能是在jOOQ3.15中引入的,支持PostgreSQL 13:
特别是,原生PostgreSQL
FETCH FIRST .. WITH TIES
支持可能触发了此更改。可能的解决方案:
ExecuteListener
中使用正则表达式修补生成的SQL字符串:搜索FETCH NEXT (\?|\d+) ROWS ONLY
并替换为LIMIT $1
。注意,虽然它是OFFSET .. FETCH
,但它是LIMIT .. OFFSET
,所以如果你想使用这种方法,请注意也必须反转绑定值的顺序。这更像是一种黑客攻击,当然,其他选项要好得多。