当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA,复杂的本机查询

宇文和同
2023-03-14

我使用Spring引导和Spring数据JPA。它工作得很好但是!我需要使用复杂的本地查询从Oracle数据库(源数据从SAP ERP)。

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

解决方案:

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

2)为了运行这些查询,我使用JDBC。这很容易,因为我准备了本机查询。但我深信这种做法是不对的。

你知道如何使用Spring数据JPA来运行非常复杂的本机查询吗?

多谢指点

共有1个答案

奚翰海
2023-03-14

我的第一印象是,您可能希望重新访问数据模型。在DB资源上连接5个表可能非常昂贵,并且数据模型可能更有用。

如果数据模型被埋没在石头里,您不想使用JPQL进行复杂的查询,也不想使用普通的JDBC,我相信您有两种选择。

>

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

    您可以考虑使用较低级别的查询生成器,如Jooq或QueRDSL。我相信JOOQ是为Oracle支付的。QueryDSL对JPA也有一些支持,但不确定有什么目标。也许是为了使JPA标准查询稍微更易于使用API。

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

  •  类似资料:
    • 我使用注释和注释执行查询,并从数据库表中删除记录。 错误: xxx的例外。xxx。xx,原因='javax。坚持不懈TransactionRequiredException:执行更新/删除查询“和异常=”执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredException:执行更新/删除查询'

    • 我的所有存储库都在扩展commonService存储库,而commonService存储库反过来也在扩展JpaRepository和JpaSpecification 我想在CommonReadRepository中定义原生Sql查询,如:mysql:select*from table limit 1,20; @Query(value=“Select*from?1 limit?2,?3”,nativ

    • 问题内容: 我有以下ManyToMany映射。 我想检索与Classe2实体有关系的所有Class1实体,其中class2Id = 1和class2Id = 2和class2Id = 3。{1,2,3} 或者,要过滤在其class2列表上具有的Classe1实体,请使用具有以下值的Class2实体:class2Id = 1和class2Id = 2和class2Id = 3 例如: 如果在联接表上

    • 我使用Spring Data JPA进行如下原生查询 现在,我的用例是 如果可用,则只应返回该类别中具有该代码的项目 但如果不可用,则应返回该类别中的所有项目 因此,上述类别的问题是当作为传递时,不会返回任何数据,因为它与任何内容都不匹配。尽管要求很高,但它应该被忽略。 那么,有没有一种方法可以选择性地向Spring数据JPA本机查询添加一个子句呢。我知道使用是可能的,但是我们能为原生查询做类似的

    • 我有3个实体在我的数据库。实体A具有主密钥PK-A,实体B具有主密钥PK-B,实体C具有主密钥PK-C。 实体A与实体B具有1对多关系,实体B与实体C具有1对多关系 我想在Spring Data JPA中基于PK-A(实际上是实体B中的外键)查询实体C。有可能吗? 但这行不通。还有什么建议我可以试试吗?

    • 我得到了以下许多映射。 我想检索所有与Classe2实体有关系的Class1实体,它们的类2Id=1和类2Id=2和类2Id=3。{1,2,3} 或者,要筛选在其class2列表上具有值的Class1实体,请使用值class2Id=1、class2Id=2和class2Id=3的class2实体 例如: 如果在联接表上,我得到了以下值。 对于这个例子,结果将是类1Id为1和6的类1。因为类1实体,