java - HibernateCallback 最适合执行 SQL/过程吗?

标签 java hibernate spring stored-procedures orm

我正在开发属于汽车制造商的基于 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 .

更多有趣的阅读:

引用资料

资源

相关问题

关于java - HibernateCallback 最适合执行 SQL/过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3647258/

相关文章:

java - JNI - 如何为不同的类创建库

java - 在 Java 中使用多个线程

java - 在启动时使用 Hibernate 验证数据库连接

java - 如何使用多个@Transactional 注解的方法?

spring - 组合 hibernate @Transactional & ehcache @Cacheable 总是创建数据库事务

java mongodb 驱动程序在重复键上不会引发异常

java - Java中数组索引越界

java - 在一段时间后终止由 exec() 启动的进程并将帧存储在数组中

java.lang.IllegalArgumentException : org. hibernate.QueryException : No data type for node: org. hibernate.hql.internal.ast.tree.MethodNode

java - 反序列化 Yaml 对象列表