gpt4 book ai didi

entity-framework - SQL 方言实际上如何在 hibernate 和 JOOQ 等框架中内部工作

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

正如我们所见,在您获得数据源之后。我们需要根据我们使用的数据库配置 SQL 方言。在我们选择了一种特定的方言之后,如何使用它来进行特定于 DB 的 SQL 查询。 hibernate 和 JOOQ 等框架是否根据所选方言以字符串形式构造 SQL 查询?如果是这样,那将是在我们自己的框架中支持这一点的最佳方式?

最佳答案

Do frameworks like hibernate and JOOQ construct SQL queries in string based on the selected dialect

是的。在 jOOQ 中,有一个内部 StringBuilder 从表达式树中收集 SQL 片段,这些片段是专门为目标 SQL 方言生成的。您可以在这个网站上看到它是如何工作的:https://www.jooq.org/translate .例如,尝试翻译此输入:SELECT * FROM t LIMIT 1(这可能对应于您的 jOOQ API 用法 ctx.selectFrom(T).limit(1)。它翻译到:

-- Oracle 12c and more
SELECT * FROM t FETCH NEXT 1 ROWS ONLY

-- Oracle 11g and less
SELECT *
FROM (
SELECT x.*, rownum rn
FROM (SELECT * FROM t) x
WHERE rownum <= 1
)
WHERE rn > 0

If so which would be the most optimal way to support this in a framework of our own ?

你需要:

  1. SQL 查询的表达式树表示。
  2. 可选地,你可以解析一个字符串来构建这个表达式树,比如jOOQ's parser如果你想支持实际的 SQL,或者你可以像 Hibernate 对 HQL/JPQL 那样拥有自己的语言抽象
  3. 使用类似于访问者的工具遍历该表达式树以收集 SQL 字符串和绑定(bind)变量。

但是!

如果您有现成的产品,例如 jOOQ 或在某种程度上可以执行相同操作的 Hibernate,请不要构建自己的产品。构建这样一个通用的 SQL 抽象真的很困难,除非你真的想销售这样的产品(你可能没有提出你的问题),否则投资这个时间来构建这个产品是完全不值得的。

上面的 LIMIT 模拟是 jOOQ 中比较简单的例子之一。 Here's a lot more to help you decide against rolling your own ,而这个答案仍然只是触及了 jOOQ 在幕后所做工作的皮毛。

关于entity-framework - SQL 方言实际上如何在 hibernate 和 JOOQ 等框架中内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55909481/

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