当前位置: 首页 > 面试题库 >

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

满伟彦
2023-03-14
问题内容

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

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

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

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

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

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

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


问题答案:

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

您可以采用两种方法:

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

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

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



 类似资料:
  • 问题内容: 我想“试运行” Hibernate HQL查询。那就是我想知道Hibernate将从给定的HQL查询中执行哪些实际的SQL查询,而无需实际针对实际数据库执行HQL查询。 我可以访问表的hibernate映射,HQL查询字符串,数据库的方言。如果需要,我也可以访问数据库。 现在,如何找到Hibernate可以从HQL生成的所有SQL查询,而无需实际对任何数据库执行查询?有什么工具吗? 请

  • 问题内容: 我对HQL查询和hibernate有疑问。 我有一个用户类和一个角色类。用户可以具有许多角色。所以我有一个像这样的ManyToMany关系: 在用户类别中: 在角色类中: 此映射创建了存储关系的第三个表(PORTAIL_USERROLE)。像这样一切正常。当我有一个用户时,我将检索角色。 但是,我的问题是:在HQL查询中,如何获得具有特定角色的所有用户?任何类都代表PORTAIL_US

  • 问题内容: 如何在Hibernate中编写此SQL查询?我想使用Hibernate创建查询,而不是创建数据库。 我在SQLServer2008中创建了实体类, 我试图以多种方式构建有效的选择查询,但仍然无法正常工作。 实体有问题吗? 问题答案: 仅当实体之间存在关联时才能使用联接。您的Employee实体不应将名称为,类型为的字段映射到列。它应该与Team实体具有ManyToOne关联,并映射为J

  • 问题内容: 在将HQL转换为SQL时,Hibernate在JDBC内部使用PreparedStatement。HQL中的内联参数如何处理? 例: 将状态“解析”并用作SQL中的参数,或者将其作为内联参数发送。 我的观点背后的原因是“最佳做法”,以及针对重复调用的查询性能 问题答案: 它被内联发送。当是客户端控制的值时,您绝对不希望这样做。 而是将其参数化: 也可以看看: OWASP-hiberna

  • 问题内容: 细节 来自应用程序的HQL查询: 查询返回300万条记录,而对于分页,我们仅设置了其中的50条记录,分页页面的运行速度非常慢,因为每次刷新时,我们都调用查询来获取300万条记录,而其中只有50条记录。 我的主要问题是 HQL是始终运行并命中数据库还是运行命中会话或内存以查找数据,如果它每次都运行时命中数据库并获取结果集,那么从性能的角度来看,这是非常合适的,什么是改进的最佳解决方案它?

  • 问题内容: 我有一个使用Hibernate在数据库上进行CRUD操作的Web应用程序。我收到一条错误消息,说该表未映射。查看Java文件: 错误信息: 这是我的方法: : 我应该如何修改才能正常工作? 问题答案: 异常消息怎么说?它说: 这告诉你什么?它告诉您未映射。也就是说,没有称为的映射类型。 确实,没有。您的映射类型称为。它映射到名为的表,但类型称为。在编写HQL(或JPQL)查询时,您使用