我想"干运行"Hibernate HQL查询.那就是我想知道Hibernate将从给定的HQL查询执行什么实际的SQL查询而不实际执行针对真实数据库的HQL查询.
我可以访问表的hibernate映射,HQL查询字符串,我的数据库的方言.如果需要,我也可以访问数据库.
现在,我怎样才能找到Hibernate可以从我的HQL生成的所有SQL查询,而无需对任何数据库实际执行查询?这有什么工具吗?
请注意,可以从一个HQL查询生成许多SQL查询,并且生成的SQL查询集可能会根据数据库的内容而有所不同.
我不是在询问HQL查询执行时如何记录SQL查询.
编辑:我不介意连接到数据库来获取一些元数据,我只是不想执行查询.
编辑:我也知道对查询应用了什么限制和偏移.我还有将绑定到查询的实际参数.
简短的回答是"你不能".答案如下.
您可以采取两种方法:
A)看HQLQueryPlan
课,特别是它的getSqlStrings()
方法.它不会得到确切的 SQL,因为在实际执行查询之前涉及进一步的预处理(参数绑定,应用限制/偏移等等)但它可能足够接近您想要的.
这里要记住的是,你需要一个实际的SessionFactory
实例来构造HQLQueryPlan
,这意味着如果没有"连接到任何数据库",你将无法这样做.但是,您可以使用内存数据库(SqlLite等)并让Hibernate自动为其创建必要的模式.
B)开始ASTQueryTranslatorFactory
并下降到AST/ANTLR疯狂.从理论上讲,您可以将一个可以在不依赖元数据的情况下工作的解析器组合在一起,但是我最难想象您正在努力为此做些什么是值得的.也许你可以澄清一下?有有是一个更好的办法.