我在Java应用程序的持久层中使用了框架Jooq,并且我希望允许在特定上下文中通过plain SQL API创建特定SELECT查询的条件的一部分.组成普通SQL部件的字符串将在运行时的某个时间点保存,而查询将在稍后的某个时间点通过后台作业(job)执行.

有没有一种方法可以验证Jooq查询可以在不实际执行的情况下无错误地执行?例如,我发现

ctx.explain(query)

我可以使用它作为变通方法,但实际上我不想执行EXPLAIN.除了这一点,还有其他 Select 吗?

非常感谢.

推荐答案

这里有一些其他的"诀窍"可能就足够了:

  • If your queries are always SELECT queries, you could wrap them in a derived table like SELECT * FROM (...) t WHERE false. This probably helps cover 95% of all syntaxes, and most optimisers should be smart enough to avoid running the derived table (do check). Some caveats:
    • FOR UPDATE条款和其他类似的SELECT功能不会以这种方式工作
    • 不允许派生表多次投影相同的列名
  • 使用jOOQ's SQL parser解析您的查询.它可以解析很多SQL,但显然不能解析所有内容,因此您可能会遇到解析器对特定于供应商的SQL的完美限制
  • 对实际RDBMS中的虚拟模式/数据库运行查询.如果您确定您的纯SQL模板不会直接访问您的生产模式,那么在具有相同逻辑模式的同一实例上使用不同的数据库可以帮助验证查询,而不会有任何性能问题,因为您不会有任何数据.
  • 对虚拟RDBMS实例运行查询,例如从docker运行.你甚至可以用testcontainers来快速旋转它.您很可能已经(或者很快就会拥有)使用测试容器的集成测试设置,所以您可以在一定程度上重用它.

Java相关问答推荐

将Nimbus设置为计算机上运行的所有Java应用程序的默认外观

是否保证在事务性块的末尾标记违反约束?

嵌入式ActiveMQ Artemis Web控制台加载错误

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

多重延迟签名

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

Arrays.hashcode(int[])为不同的元素提供相同的散列

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

尽管通过中断请求线程死亡,但线程仍将继续存在

有效的公式或值列表必须少于或等于255个字符

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

从映射列表中检索所有键

无法将GSON导入到我的JavaFX Maven项目

对角线填充二维数组

如何在运行docker的应用程序中获取指定的配置文件

接受类及其接口的Java类型(矛盾)

根据应用程序 Select 的语言检索数据

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

ResponseEntity.控制器截断响应的JSON部分

在数组列表中找到对象后,未从数组中删除对象