首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HibernateCallback是执行SQL/procedures的最佳选择吗?

HibernateCallback是执行SQL/procedures的最佳选择吗?
EN

Stack Overflow用户
提问于 2010-09-06 02:37:50
回答 3查看 2K关注 0票数 2

我正在开发一个基于web的应用程序,它属于一家汽车制造商,使用MS SQL Server2005数据库在Spring-Hibernate中开发。

有三种用例:

1)通过此应用程序,最终用户可以通过基于web的界面请求创建小汽车、公共汽车、卡车等。当用户登录时,将显示一个HTML表单,用于捕获车辆的技术规格,例如,如果有人想要申请汽车,他可以指定发动机制造商/型号,轮胎,底盘详细信息等,并提交表单。我在这里使用Hibernate进行持久化,也就是说,对于每个这样的请求,我都有一个汽车实体保存在DB中。

2)应用程序的这一部分处理报告的生成。这些报告主要包括一天内收到的请求数量和摘要。一些报告计算单个创建车辆请求的周转时间。

我使用普通的JDBC调用Preparedstatement (如果报表可以用SQL生成),Callablestatement (如果报表足够复杂,需要一个DB过程/函数来获取所有细节)和HibernateCallback来执行SQL/过程并在屏幕上显示信息。

3)搜索:应用程序的这一部分允许ensd用户搜索各种请求数据,例如一年内有多少车辆被请求等。我正在使用DB过程和CallableStatement..Once再次在HibernateCallback中执行这些过程,填充并返回POJO图形用户界面上的搜索结果。

我在上面的(2)和(3)中使用原生SQL,因为出于报告/搜索的目的,屏幕上显示的报告数据结构与我的任何实体都不匹配。对于ex: Car实体本身有超过100个属性,但出于报告目的,我不需要超过10个属性。因此,我只是认为加载所有100个属性没有任何意义,所以为什么不使用纯SQL并只检索在屏幕上显示所需的数据。

同样,对于搜索,我必须编写过程/函数,因为搜索算法不是直接的,而Hibernate没有办法编写存储过程之类的东西。

这是工作很好的原型类型,但我想知道

a.根据我的判断,我使用原生SQL和DB过程的方法是否适用于情况2和3。b.另外,在HibernateCallback中执行SQL是否是正确的方法?

需要专家的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-06 06:12:49

我想知道(...)如果根据我的判断,我使用原生SQL和DB过程的方法适用于情况2和3

没有什么能强迫您在第二种情况下使用存储过程,您可以使用HQL和投影,如前所述:

代码语言:javascript
复制
select f.id, f.firstName from Foo f where ...

它将根据where条件返回Object[]List<Object[]>

如果你想得到类型安全的结果,你可以使用SELECT NEW表达式(假设你提供了合适的构造函数):

代码语言:javascript
复制
select new Foo(f.id, f.firstName) from Foo f

您甚至可以返回非实体

代码语言:javascript
复制
select new com.acme.LigthFoo(f.id, f.firstName) from Foo f

对于情况3,情况似乎不同。为了以防万一,请注意Criteria API比HQL更适合构建dynamic queries。但看起来这不会有什么帮助。

我想知道(...)在HibernateCallback中执行SQL是不是正确的方法?

首先,在使用存储过程时会出现several restrictions,我倾向于尽可能避免使用它们。其次,如果你想要返回实体,这并不是我们看到的唯一方法和最简单的解决方案。因此,对于第二种情况,我会考虑使用HQL。

对于第三种情况,由于根本不返回实体,我会考虑不使用Hibernate API,而使用Spring的JDBC支持,它为IMHO提供了一个比Session#connection()HibernateCallback更干净的API。

更多有趣的读物:

参考文献

关于

  • 14.6. The select clause (关于select new)
  • 16.1.5. Returning non-managed entities (关于ResultTransformer)
  • 16.2.2. Using stored procedures for querying

))

  • Hibernate核心参考指南

资源

  • Hibernate 3.2: Transformers for HQL and SQL

相关问题

票数 3
EN

Stack Overflow用户

发布于 2010-09-06 05:30:08

您应该努力使用尽可能多的HQL,除非您有一个很好的论点(比如性能,但首先要做一个基准测试)。如果原生查询的使用过多,您应该考虑Hibernate是否是一个好的选择。

请注意以下几点:

  • 您可以使用本机查询和存储过程来生成Hibernate实体。你只需要通过session.createSQLQuery(queryName)
  • If调用一个类,你真的需要在运行时构造原生查询,最新版本的hibernate有一个doWork(..)方法,你可以用它来做map the query / storproc call工作。
票数 3
EN

Stack Overflow用户

发布于 2010-09-06 04:28:13

你说

For ex: Car entity本身有超过100个属性,但出于报告目的,我不需要超过10个属性。所以我只是认为加载所有100个属性没有任何意义

但是hibernate中的HQL允许您进行投影(只选择后面列的一个子集)。如果你不想这样做,你不需要拉出整个实体。

然后,您将获得HQL的所有好处(结果类型、HQL连接语法),但您几乎可以编写SQLish代码。

有关HQL文档,请参阅here;有关select语法,请参阅here。如果你习惯了SQL,那就很简单了。

所以直接回答你

a -不,我认为你应该使用HQL b-如果你接受我的建议a就变得无关紧要了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3647258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档