2010-01-26 59 views
6

我目前的工作场所使用标准的Spring/Hibernate/JSP混合来通过XML向Flex客户端提供内容。访问数据的方式很多,但最流行的方式是通过对数据库的直接SQL调用和手动转换为XML。Java/Hibernate:如何为复杂的SQL编写DAO代码

麻烦的是,随着应用程序越来越大,SQL变得越来越复杂,难以维护。就好像维护使用StringBuilders创建的SQL不够困难,现在更糟糕的是,使用许多if语句和循环动态构建SQL。

我知道通常正确的方法是使用Hibernate查询和实体获取项目。但是,在我们的一些请求中,结果不能映射到单个Hibernate实体,我担心需要使用直接SQL。

什么是正确的方式去做这件事?有没有办法让动态SQL查询更清晰?有没有办法与Hibernate实体做到这一点?

我很抱歉这个问题的抽象性。我希望你仍然有很好的输入;)

感谢您的意见!

回答

3

HQL支持获取多个实体的查询。联接也被支持。例如:

SELECT new com.package.model.SearchResultEntry(product, price) FROM Product product, 
    IN(product.variantPrices) price WHERE .... 

上面返回一个新的(非实体!)对象,它由两个实体 - 产品和价格组成。您也可以使用List来从相同的结果中放入不同的实体。

this tutorial aouourough阅读。

让这些查询与动态参数,并使用最合适的班级将它们存储为@NamedQueries

2

您可以考虑将一些SQL逻辑移入数据库并通过视图访问数据:当然会出现它自己的问题(您现在在两个地方有业务逻辑),但可能值得考虑。

+0

我有点同意,尽管很多人不喜欢SQL中存储的特效和逻辑。如果您有一个非常复杂的SQL查询,那么通过尝试在代码中执行操作或使用像HQL这样的不太健壮的查询语言,实在没有办法简化它。 – 2010-01-26 22:58:38

0

假设你不能做你的HQL需要什么看一看ibatis这将允许您设置映射使用特定的SQL查询和存储过程。它也将成为您项目的另一个依赖项,因此也要考虑到这一点。