我正在开发属于汽车制造商的基于 Web 的应用程序,该应用程序使用 MS SQL Server 2005 数据库在 Spring-Hibernate 中开发。
共有三种用例:
1) 通过此应用程序,最终用户可以请求通过基于 Web 的界面创建汽车、公共(public)汽车、卡车等。当用户登录时,会显示一个 HTML 表单以获取车辆的技术规范,例如,如果有人想申请汽车,他可以指定发动机品牌/型号、轮胎、底盘详细信息等并提交表单。我在这里使用 Hibernate 来实现持久性,即我有一个汽车实体,它会针对每个此类请求保存在数据库中。
2) 应用程序的这一部分处理报告的生成。这些报告主要与一天内收到的请求数量和摘要有关。一些报告计算单个创建车辆请求的周转时间。
我正在使用带有 Preparedstatement(如果可以使用 SQL 生成报告)、Callablestatement(如果报告足够复杂并且需要数据库过程/函数来获取所有详细信息)和 HibernateCallback 来执行 SQL/过程和在屏幕上显示信息。
3) 搜索:这部分应用程序允许 ensd 用户搜索各种请求数据,即一年中请求了多少车辆等。我正在使用带有 CallableStatement 的 DB 程序。再次在 HibernateCallback 中执行这些程序,在 POJO 中的 GUI 上填充和返回搜索结果。
我在上面的 (2) 和 (3) 中使用了 native SQL,因为出于报告/搜索目的,要在屏幕上显示的报告数据结构与我的任何实体都不匹配。例如:汽车实体本身有超过 100 个属性,但出于报告目的我不需要超过 10 个属性。所以我只是虽然加载所有 100 个属性没有任何意义,所以为什么不使用纯 SQL并仅检索在屏幕上显示所需的数据。
与搜索类似,我必须编写过程/函数,因为搜索算法不是直接的,而且 Hibernate 没有办法编写存储过程之类的东西。
这对于原型(prototype)类型来说工作正常,但我想知道
一个。根据我的判断,如果我使用 native SQL 和数据库过程的方法适用于案例 2 和案例 3。 b.另外,在 HibernateCallback 中执行 SQL 是否是正确的方法?
需要专家的帮助。
最佳答案
I would like to know (...) if my approach for using native SQLs and DB procedures are fine for case 2 and 3 based on my judgment
对于情况 2,没有什么可以强制您使用存储过程,您可以使用 HQL 和预测,正如已经指出的那样:
select f.id, f.firstName from Foo f where ...
这将返回 Object[]
或 List<Object[]>
取决于 where 条件。
如果你想要类型安全的结果,你可以使用 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 .但看起来这在这里无济于事。
I would like to know (...) whether executing SQLs in HibernateCallback is correct approach?
首先有several restrictions在使用存储过程时,我宁愿尽可能避免使用它们。其次,如果您想返回实体,这并不是我们看到的唯一方法和最简单的解决方案。所以对于情况 2,我会考虑使用 HQL。
对于情况 3,由于您根本不返回实体,因此我会考虑不使用 Hibernate API,而是考虑使用 Spring 的 JDBC 支持,恕我直言,它提供了比 Session#connection()
更干净的 API。和 HibernateCallback
.
更多有趣的阅读:
引用资料
- Hibernate 核心引用指南
- 14.6. The select clause (关于
select new
) - 16.1.5. Returning non-managed entities (关于
ResultTransformer
) - 16.2.2. Using stored procedures for querying
- 14.6. The select clause (关于
资源
相关问题
关于java - HibernateCallback 最适合执行 SQL/过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3647258/