Spring data JPA,复杂原生Query

Posted

技术标签:

【中文标题】Spring data JPA,复杂原生Query【英文标题】:Spring data JPA, complex native Query 【发布时间】:2016-01-13 06:01:04 【问题描述】:

我使用 Spring Boot 和 Spring Data JPA。它工作正常,但是! 我需要使用来自 Oracle 数据库的复杂本机查询(来自 SAP ERP 的源数据)。

假设查询包含 5 个连接表(一个键或复合键)。 我可以使用很多参数。

解决方案:

1) 由于耗时,使用 JPA 为该查询编写新查询是不真实的。创建表之间的所有关键关系似乎很复杂。

2) 为了运行这些查询,我使用 JDBC。这很容易,因为我已经准备好了原生查询。但我坚信这种做法是不对的。

你知道如何使用 Spring data JPA 来运行非常复杂的原生查询吗?

感谢您的建议

【问题讨论】:

这可能是一个老问题,我只是想知道当我们的应用程序以 SQL 为中心有多个连接时,为什么我们不能使用简单的 Spring JDBC 模板 【参考方案1】:

我的第一印象是您可能想重新审视数据模型。加入 5 个表在数据库资源上可能相当昂贵,而您的数据模型可能更有用de-normalized。

如果数据模型一成不变,你又不想使用 JPQL 进行复杂的查询,又不想使用普通的 JDBC,我相信你有两个选择。

    使用JPA criteria queries。它们与Hibernate Criteria API 略有相似,实际上它们是用来替换它们的。我只使用了基于 JEE6 的 JPA Criteria 查询,它们有时感觉有点笨拙。不确定 JEE7 是否会变得更好。

    您可以考虑使用较低级别的查询构建器,例如 JOOQ 或 QueryDSL。我相信 JOOQ 是为 Oracle 支付的。 QueryDSL 也有一些对 JPA 的支持,但不确定有什么目标。也许是为了让 JPA 条件查询 API 更实用。

这两个选项都允许使用 Java 链式 API 构造类型安全查询,因此您在 Java 代码中的查询不应比普通 SQL 代码多太多。

【讨论】:

以上是关于Spring data JPA,复杂原生Query的主要内容,如果未能解决你的问题,请参考以下文章

Spring data jpa,原生查询Hibernate异常

Spring Data JPA 将原生查询结果映射到非实体 POJO

spring jpa 自带page @Query 出错

Spring Data JPA使用Sort进行排序(Using Sort)(转)

spring-data-jpa @Query 支持正则表达式语法吗?

Spring Data JPA native query 分页