如何看到 jOOQ 在编译时执行的 SQL 语句?
How can one see the SQL statements that jOOQ executes at Compile Time?
我使用 jOOQ query/insert/update 数据 from/into table。
有没有办法查看 JOOQ 在编译时执行的 SQL 语句而不是 运行 时间记录?
以下答案显示的是 运行 时间。 How can one see the SQL statements that jOOQ executes?
此工具只能转换各种 SQL 方言。 https://www.jooq.org/translate/
静态评估 jOOQ 查询
虽然可以构建一些能够评估一些静态ish jOOQ语句的IDE插件,但请记住,原则上和设计上,每个 jOOQ 查询都是一个dynamic SQL query。当你写一些像这样简单的东西时:
Result<?> r = ctx.select(T.A, T.B).from(T).fetch();
JVM 看到的(大致)是:
Field<?> a = T.A;
Field<?> b = T.B;
Field<?>[] select = { a, b };
SelectFromStep<?> s1 = ctx.select(select);
Table<?> t = T;
SelectWhereStep<?> s2 = s1.from(t);
Result<?> r = s2.fetch();
当然,没有人以这种方式使用jOOQ。 The DSL was designed to produce call chains that look almost like SQL through its fluent API design。因此,您的查询 看起来 是静态的 SQL(可以在 IDE 中计算),但事实并非如此。你会经常使用动态 SQL 功能,例如
Result<?> r = ctx
.select(T.A, T.B)
.from(T)
// Dynamic where clause
.where(someCondition ? T.A.eq(1) : T.B.gt(2))
.fetch();
IDE 无法评估所有这些,包括您所有的 SPI 实现,例如 ExecuteListener
or the VisitListener
,因此,即使它在某些情况下有效,它也无法正常工作对于其他许多人。
您必须执行查询才能看到实际的 SQL(对于该特定执行)。或者,您在 fetch()
调用上放置一个断点,并评估在调试器中调用 fetch()
的查询对象。
底层,实际问题
每当我看到这个问题时,我认为有一个潜在的实际问题体现在 运行 Java 之外的 jOOQ 查询的愿望中代码。问题是你的代码似乎很难集成测试。
这不容易修复,但这是一个很好的提醒,当您从头开始时,您可以使用以下方法轻松地对所有 SQL(jOOQ 或非 jOOQ)进行集成测试:
- 类似于testcontainers
- 通过分离关注点并将您的 SQL 逻辑移动到适当的层中,该层可以独立于任何其他逻辑(UI 等)轻松进行集成测试
通过这种方法,您将能够在更好的反馈周期中测试您的 jOOQ 查询,在这种情况下您可能甚至不会想到 运行 在您的 Java 再次编码,至少大部分时间是这样。
我使用 jOOQ query/insert/update 数据 from/into table。
有没有办法查看 JOOQ 在编译时执行的 SQL 语句而不是 运行 时间记录?
以下答案显示的是 运行 时间。 How can one see the SQL statements that jOOQ executes?
此工具只能转换各种 SQL 方言。 https://www.jooq.org/translate/
静态评估 jOOQ 查询
虽然可以构建一些能够评估一些静态ish jOOQ语句的IDE插件,但请记住,原则上和设计上,每个 jOOQ 查询都是一个dynamic SQL query。当你写一些像这样简单的东西时:
Result<?> r = ctx.select(T.A, T.B).from(T).fetch();
JVM 看到的(大致)是:
Field<?> a = T.A;
Field<?> b = T.B;
Field<?>[] select = { a, b };
SelectFromStep<?> s1 = ctx.select(select);
Table<?> t = T;
SelectWhereStep<?> s2 = s1.from(t);
Result<?> r = s2.fetch();
当然,没有人以这种方式使用jOOQ。 The DSL was designed to produce call chains that look almost like SQL through its fluent API design。因此,您的查询 看起来 是静态的 SQL(可以在 IDE 中计算),但事实并非如此。你会经常使用动态 SQL 功能,例如
Result<?> r = ctx
.select(T.A, T.B)
.from(T)
// Dynamic where clause
.where(someCondition ? T.A.eq(1) : T.B.gt(2))
.fetch();
IDE 无法评估所有这些,包括您所有的 SPI 实现,例如 ExecuteListener
or the VisitListener
,因此,即使它在某些情况下有效,它也无法正常工作对于其他许多人。
您必须执行查询才能看到实际的 SQL(对于该特定执行)。或者,您在 fetch()
调用上放置一个断点,并评估在调试器中调用 fetch()
的查询对象。
底层,实际问题
每当我看到这个问题时,我认为有一个潜在的实际问题体现在 运行 Java 之外的 jOOQ 查询的愿望中代码。问题是你的代码似乎很难集成测试。
这不容易修复,但这是一个很好的提醒,当您从头开始时,您可以使用以下方法轻松地对所有 SQL(jOOQ 或非 jOOQ)进行集成测试:
- 类似于testcontainers
- 通过分离关注点并将您的 SQL 逻辑移动到适当的层中,该层可以独立于任何其他逻辑(UI 等)轻松进行集成测试
通过这种方法,您将能够在更好的反馈周期中测试您的 jOOQ 查询,在这种情况下您可能甚至不会想到 运行 在您的 Java 再次编码,至少大部分时间是这样。