Java / Hibernate:如何为复杂的SQL编写DAO代码

时间:2010-01-26 22:36:33

标签: java sql hibernate orm

我目前的工作场所使用标准的Spring / Hibernate / JSP组合,通过XML为其Flex客户端提供内容。有许多方法可以访问数据,但最常见的方法是通过对数据库的直接SQL调用和手动转换为XML。

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

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

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

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

感谢您的评论!

3 个答案:

答案 0 :(得分:3)

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

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

以上内容返回一个由两个实体组成的新(非实体!)对象 - 产品和价格。您还可以使用List将不同的实体放在同一个结果中。

通过阅读this tutorial

使用动态参数进行这些查询,并使用最合适的类将它们存储为@NamedQueries

答案 1 :(得分:2)

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

答案 2 :(得分:0)

假设您无法在HQL中执行所需操作,请查看ibatis它将允许您使用特定的SQL查询和存储过程设置映射。它也将是您项目的另一个依赖项,所以也要考虑到这一点。

相关问题