升级JOOQ从3.14.6到3.17.5时LIMIT子句生成变化的问询
JOOQ 3.14.6 升级至 3.17.5 的SQL生成差异问题
问题背景
将JOOQ从3.14.6升级到3.17.5后,针对Postgres数据库生成的分页SQL出现差异:
- 3.14.6版本生成的SQL:
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;
- 3.17.5版本生成的SQL:
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. 如何让3.17.5版本生成与3.14.6一致的SQL?
可以通过JOOQ的Settings配置切换分页语法生成逻辑:
- 在创建
DSLContext时,设置fetchFirstUsingLimit为true,即可让JOOQ继续生成LIMIT语法的分页SQL:
Settings settings = new Settings() .withFetchFirstUsingLimit(true); DSLContext dsl = DSL.using(connection, SQLDialect.POSTGRES, settings);
该配置为运行时生效,无需修改代码生成器设置。
2. 有没有汇总3.14.6到3.17.5版本SQL生成变化的文档?
JOOQ官方每个大版本的发布笔记会包含SQL生成相关的变更内容,可依次查看3.15、3.16、3.17版本的发布说明,重点关注以下章节:
- SQL Dialect Support(方言支持更新)
- Query Rendering(查询渲染逻辑调整)
这些章节会详细记录SQL生成规则的变化、新语法支持等内容。
内容的提问来源于stack exchange,提问作者tuk
相关产品推荐
相关产品推荐

