我想“试运行” Hibernate HQL查询。那就是我想知道Hibernate将从给定的HQL查询中执行哪些实际的SQL查询,而无需实际针对实际数据库执行HQL查询。
我可以访问表的hibernate映射,HQL查询字符串,数据库的方言。如果需要,我也可以访问数据库。
现在,如何找到Hibernate可以从HQL生成的所有SQL查询,而无需实际对任何数据库执行查询?有什么工具吗?
请注意,可以从一个HQL查询中生成许多SQL查询,并且所生成的SQL查询集可能会根据数据库的内容而有所不同。
我不问如何在执行HQL查询时记录SQL查询。
编辑:我不介意连接到数据库以获取一些元数据,我只是不想执行查询。
编辑:我也知道什么限制和偏移量应用于查询。我也有将绑定到查询的实际参数。
简短的回答是“你不能”。长答案在下面。
您可以采用两种方法:
A)研究HQLQueryPlan类,特别是它的getSqlStrings()方法。它不会为您提供 确切的 SQL,因为在实际执行查询之前会进行进一步的预处理(绑定参数,应用限制/偏移量等),但它可能与您想要的足够接近。
HQLQueryPlan
getSqlStrings()
这里要记住的事情是,您需要一个实际的SessionFactory实例来进行构造HQLQueryPlan,这意味着如果不“连接到任何数据库”就无法做到这一点。但是,您可以使用内存数据库(SqlLite等),并让Hibernate自动为其创建必要的架构。
SessionFactory
B)开始ASTQueryTranslatorFactory并陷入AST / ANTLR疯狂。从理论上讲,您可能可以破解一个无需依赖元数据就可以工作的解析器,但是我很难想象要为此付出的努力。也许您可以澄清一下?有 有 是一个更好的办法。
ASTQueryTranslatorFactory