gpt4 book ai didi

jooq - 自定义 jOOQ 方言以更改 LIMIT 和 OFFSET 在语句中呈现的顺序

转载 作者:行者123 更新时间:2023-12-05 05:33:25 26 4
gpt4 key购买 nike

我正在使用 jOOQ 生成针对 Athena(又名 PrestoDB/Trino)运行的查询

为此,我使用了 SQLDialects.DEFAULT,它之所以有效,是因为我使用了非常基本的查询功能。

但是,jOOQ 会像这样呈现查询:

select *
from "Artist"
limit 10
offset 10

天知道为什么,但是 limitoffset 的顺序似乎很重要,查询只有在交换顺序的情况下才有效:

select *
from "Artist"
offset 10
limit 10

有没有我可以子类化的类,以修改语句渲染函数,以便交换它们的顺序?还是我自己实现的任何其他方式?

最佳答案

jOOQ 中的通用解决方案

在 jOOQ 中,没有一种简单的方法可以如此轻松地更改像 SELECT 子句顺序(或任何其他 SELECT 子句语法)这样基本的东西,简单地说,因为除了支持边缘 SQL 方言之外,这从来都不是核心 jOOQ 使用的要求。由于对 SQL 方言的支持在 jOOQ 中需要大量工作(包括所有集成测试、边缘案例等),而且由于 market shares这些方言的比例很低,所以在 jOOQ 中改进这一点从来都不是优先事项。

在这种情况下,您可能会认为这“只是”关于关键字的顺序。 “只有这一件。”它从来没有。它永远不会停止,方言的细微差异永远不会结束。只需查看 jOOQ 代码库,就可以了解不同供应商选择制作方言的方式有多么古怪。在这种特殊情况下,人们会认为使该子句与 MySQL/PostgreSQL/SQLite 兼容似乎非常明显和简单,因此最好的机会是向供应商提出功能请求。与市场领导者更加兼容以促进迁移应该符合他们自己的最佳利益。

jOOQ 中的解决方法

  • 当然,您可以在低级别修补生成的 SQL,例如使用 ExecuteListener和一个简单的正则表达式。每当遇到 limit (\d+|\?) offset (\d+|\?) 时,只需交换值(并绑定(bind)值!)。这对于顶级选择可能相当有效。如果您在嵌套选择中使用 LIMIT .. OFFSET 显然会更难,但可能仍然可行。
  • 修补 jOOQ 始终是一种选择。您在 jOOQ 3.17 中寻找的类是 org.jooq.impl.Limit。它包含此子句的所有呈现逻辑。如果那是你唯一的补丁,那么升级 jOOQ 是可能的。但显然,修补是一个滑坡,因为您可能会开始修补各种条款,从而使升级变得不可能。
  • 你显然可以使用 plain SQL templates对于简单的情况,例如resultQuery("{0} offset {1} limit {2}", actualSelect, val(10), val(10))。这不能很好地扩展,但如果它只有大约 1-2 个查询,它可能就足够了

使用SQLDialect.DEFAULT

此时我必须警告您,SQLDialect.DEFAULT 的行为是未指定的。它的主要目的是当您在不是 AttachableQueryPart 上调用 QueryPart.toString() 时生成东西>,其中没有更好的 SQLDialectDEFAULT 方言可能会在次要版本(甚至是补丁版本,如果某些 toString() 方法中存在重要错误)之间发生变化,因此您基于此的任何实现都位于每次升级都有崩溃的风险。

最可行的长期解决方案

...将在 jOOQ 中支持这些方言:

关于jooq - 自定义 jOOQ 方言以更改 LIMIT 和 OFFSET 在语句中呈现的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73862207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com