HibernateCallback 最适合执行 SQL/过程吗?
Posted
技术标签:
【中文标题】HibernateCallback 最适合执行 SQL/过程吗?【英文标题】:Is HibernateCallback best for executing SQL/procedures? 【发布时间】:2010-09-05 18:37:50 【问题描述】:我正在开发一个属于汽车制造商的基于 Web 的应用程序,该应用程序是在 Spring-Hibernate 中使用 MS SQL Server 2005 数据库开发的。
共有三种用例:
1) 通过此应用程序,最终用户可以通过基于 Web 的界面请求创建汽车、公共汽车、卡车等。当用户登录时,会显示一个 html 表单,用于捕获车辆的技术规格,例如,如果有人想请求汽车,他可以指定发动机品牌/型号、轮胎、底盘详细信息等并提交表单。我在这里使用 Hibernate 来实现持久性,即我有一个 Car Entity,每个此类请求都保存在 DB 中。
2) 应用程序的这一部分处理报告的生成。这些报告主要包含一天收到的请求数和摘要。一些报告计算单个创建车辆请求的周转时间。
我正在使用带有 Preparedstatement 的普通 JDBC 调用(如果可以使用 SQL 生成报告)、Callablestatement(如果报告足够复杂并且需要一个数据库过程/函数来获取所有详细信息)和 HibernateCallback 来执行 SQL/过程和在屏幕上显示信息。
3) 搜索:这部分应用程序允许 ensd 用户搜索各种请求数据,即一年内请求了多少车辆等。我正在使用带有 CallableStatement 的 DB 过程。再次在 HibernateCallback 中执行这些过程,在 POJO 中的 GUI 上填充并返回搜索结果。
我在上面的 (2) 和 (3) 中使用本机 SQL,因为出于报告/搜索目的,屏幕上显示的报告数据结构与我的任何实体都不匹配。例如:汽车实体本身有超过 100 个属性,但出于报告目的,我不需要超过 10 个属性。所以我只是加载所有 100 个属性没有任何意义,所以为什么不使用普通 SQL并仅检索在屏幕上显示所需的数据。
与搜索类似,我必须编写过程/函数,因为搜索算法不是直截了当的,而且 Hibernate 无法编写存储过程之类的东西。
这适用于原型类型,但是我想知道
一个。如果根据我的判断,我使用本机 SQL 和 DB 过程的方法适用于案例 2 和 3。 湾。另外在 HibernateCallback 中执行 SQL 是否正确?
需要专家的帮助。
【问题讨论】:
【参考方案1】:我想知道 (...) 根据我的判断,我使用原生 SQL 和 DB 过程的方法是否适用于案例 2 和 3
没有什么会强迫您对案例 2 使用存储过程,您可以使用 HQL 和预测,正如已经指出的那样:
select f.id, f.firstName from Foo f where ...
根据 where 条件返回 Object[]
或 List<Object[]>
。
如果您想要类型安全的结果,您可以使用 SELECT NEW
表达式(假设您提供了适当的构造函数):
select new Foo(f.id, f.firstName) from Foo f
你甚至可以返回非实体
select new com.acme.LigthFoo(f.id, f.firstName) from Foo f
对于案例 3,情况似乎有所不同。以防万一,请注意 Criteria API 比 HQL 更适合构建 dynamic queries。但看起来这在这里无济于事。
我想知道(...)在 HibernateCallback 中执行 SQL 是否正确?
首先,使用存储过程时有several restrictions,我希望尽可能避免使用它们。其次,如果你想返回实体,这不是我们看到的唯一方法和最简单的解决方案。所以对于案例 2,我会考虑使用 HQL。
对于案例 3,由于您根本不返回实体,我会考虑不使用 Hibernate API,而是使用 Spring 的 JDBC 支持,它为恕我直言提供比 Session#connection()
和 HibernateCallback
更简洁的 API。
更多有趣的读物:
参考文献
Hibernate Core 参考指南 14.6. The select clause(关于select new
)
16.1.5. Returning non-managed entities(关于ResultTransformer
)
16.2.2. Using stored procedures for querying
资源
Hibernate 3.2: Transformers for HQL and SQL相关问题
hibernate SQLquery extract variable hibernate query language or using criteria【讨论】:
非常感谢。是的,完全可以避免使用 Hibernate,因为对于 Search 相关的用例,输出不会确认到实体,这可以在 Spring 中很好地处理。【参考方案2】:你应该尽可能多地使用 HQL,除非你有一个好的论据(比如性能,但首先做一个基准测试)。如果原生查询的使用变得过多,您应该考虑 Hibernate 是否是一个不错的选择。
注意几点:
您可以拥有导致 Hibernate 实体的本机查询和存储过程。您只需 map the query / storproc call 上课并通过 session.createSQLQuery(queryName)
调用它
如果你真的需要在运行时构造原生查询,最新版的hibernate有一个doWork(..)
方法,通过它你可以做JDBC的工作。
【讨论】:
【参考方案3】:你说
例如:汽车实体本身有超过 100 个属性,但出于报告目的,我不需要超过 10 个属性。所以我只是加载所有 100 个属性没有任何意义
但是 hibernate 中的 HQL 允许您进行投影(仅选择后面的列的子集)。如果你不想,你不必拉整个实体。
然后您将获得 HQL 的所有好处(结果类型化、HQL 连接语法),但您几乎可以编写 SQLish 代码。
有关 HQL 文档,请参阅 here,有关选择语法,请参阅 here。如果您习惯使用 SQL,这很容易。
所以直接回答你
a - 不,我认为您应该使用 HQL b - 如果您同意我对 a 的建议,则变得无关紧要。
【讨论】:
以上是关于HibernateCallback 最适合执行 SQL/过程吗?的主要内容,如果未能解决你的问题,请参考以下文章
Async / await vs then 哪个最适合性能?
开源深度学习平台 TensorFlowCaffeMXNet……哪个最适合你