我正在开发一个基于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是否是正确的方法?
需要专家的帮助。
发布于 2010-09-06 06:12:49
我想知道(...)如果根据我的判断,我使用原生SQL和DB过程的方法适用于情况2和3
没有什么能强迫您在第二种情况下使用存储过程,您可以使用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,我倾向于尽可能避免使用它们。其次,如果你想要返回实体,这并不是我们看到的唯一方法和最简单的解决方案。因此,对于第二种情况,我会考虑使用HQL。
对于第三种情况,由于根本不返回实体,我会考虑不使用Hibernate API,而使用Spring的JDBC支持,它为IMHO提供了一个比Session#connection()和HibernateCallback更干净的API。
更多有趣的读物:
参考文献
关于
select new)ResultTransformer)))
资源
相关问题
发布于 2010-09-06 05:30:08
您应该努力使用尽可能多的HQL,除非您有一个很好的论点(比如性能,但首先要做一个基准测试)。如果原生查询的使用过多,您应该考虑Hibernate是否是一个好的选择。
请注意以下几点:
session.createSQLQuery(queryName)doWork(..)方法,你可以用它来做map the query / storproc call工作。发布于 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就变得无关紧要了。
https://stackoverflow.com/questions/3647258
复制相似问题