java - 如何查看 jOOQ 在编译时执行的 SQL 语句?
问题描述
我使用 jOOQ 从表中查询/插入/更新数据。
有没有办法查看 JOOQ 在编译时执行的 SQL 语句而不是运行时日志记录?
以下答案在运行时显示它们。如何查看 jOOQ 执行的 SQL 语句?
此工具仅转换各种 SQL 方言。https://www.jooq.org/translate/
解决方案
静态评估 jOOQ 查询
虽然可以构建一些能够评估一些静态 jOOQ 语句的 IDE 插件,但请记住,原则上和设计上,每个jOOQ 查询都是动态 SQL 查询。当你写一些简单的东西时:
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。DSL 旨在通过其流畅的 API 设计生成看起来几乎像 SQL 的调用链。因此,您的查询看起来像是静态 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 实现,例如 theExecuteListener
或 the VisitListener
,因此,即使它在某些情况下有效,但在许多其他情况下效果不佳。
您必须执行查询才能看到实际的 SQL(针对该特定执行)。或者,您在调用上放置一个断点,并评估在调试器中调用fetch()
的查询对象。fetch()
潜在的,实际的问题
每当我看到这个问题时,我认为有一个潜在的实际问题体现在这种在 Java 代码之外运行 jOOQ 查询的愿望。问题是您的代码似乎很难进行集成测试。
这不能轻易解决,但这是一个很好的提醒,当您从头开始时,您可以使用以下方法轻松集成测试所有 SQL(无论是否为 jOOQ):
- 类似测试容器的东西
- 通过分离关注点并将您的 SQL 逻辑移动到适当的层中,可以轻松地独立于任何其他逻辑(UI 等)进行集成测试
使用这种方法,您将能够在更好的反馈周期中测试您的 jOOQ 查询,在这种情况下,您可能甚至不会考虑再次在 Java 代码之外运行 jOOQ 查询,至少大部分时间是这样.
推荐阅读
- javascript - 带有文本和值下拉列表的 Kendo UI 网格过滤器
- c# - 如何读取文件中的数据并将行保存到二维表中
- python - 如何在此代码中返回位置而不是无(二进制搜索)
- angular - Angular 7 - ngbRadioGroup 不起作用 - 没有名称的表单控件的值访问器
- angular - 如何从垫输入验证电子邮件地址?(角度材料)
- ajax - CORS:对预检请求的响应未通过访问控制检查
- python - 如何获取 html 输入并在 views.py 中使用它?
- git - 有没有办法从我的功能分支中删除合并的分支?
- python - 在 Python 中对字母数字字符串进行排序——选择排序、冒泡排序
- python - 如何在 python pycharm 中安装 zmq 并修复错误