一尘不染

休眠和空运行的HQL查询静态

hibernate

我想“试运行” Hibernate
HQL查询。那就是我想知道Hibernate将从给定的HQL查询中执行哪些实际的SQL查询,而无需实际针对实际数据库执行HQL查询。

我可以访问表的hibernate映射,HQL查询字符串,数据库的方言。如果需要,我也可以访问数据库。

现在,如何找到Hibernate可以从HQL生成的所有SQL查询,而无需实际对任何数据库执行查询?有什么工具吗?

请注意,可以从一个HQL查询中生成许多SQL查询,并且所生成的SQL查询集可能会根据数据库的内容而有所不同。

我不问如何在执行HQL查询时记录SQL查询。

编辑:我不介意连接到数据库以获取一些元数据,我只是不想执行查询。

编辑:我也知道什么限制和偏移量应用于查询。我也有将绑定到查询的实际参数。


阅读 236

收藏
2020-06-20

共1个答案

一尘不染

简短的回答是“你不能”。长答案在下面。

您可以采用两种方法:

A)研究HQLQueryPlan,特别是它的getSqlStrings()方法。它不会为您提供
确切的 SQL,因为在实际执行查询之前会进行进一步的预处理(绑定参数,应用限制/偏移量等),但它可能与您想要的足够接近。

这里要记住的事情是,您需要一个实际的SessionFactory实例来进行构造HQLQueryPlan,这意味着如果不“连接到任何数据库”就无法做到这一点。但是,您可以使用内存数据库(SqlLite等),并让Hibernate自动为其创建必要的架构。

B)开始ASTQueryTranslatorFactory并陷入AST
/ ANTLR疯狂。从理论上讲,您可能可以破解一个无需依赖元数据就可以工作的解析器,但是我很难想象要为此付出的努力。也许您可以澄清一下?有
是一个更好的办法。

2020-06-20