【问题标题】:Multiple table joins in Spring Data JPA (Spring Boot 2)Spring Data JPA(Spring Boot 2)中的多个表连接
【发布时间】:2021-12-15 16:34:19
【问题描述】:

我对 Spring Boot 还很陌生。我正在尝试加入一堆表并取回一些数据。我已经为我正在使用的三个表创建了实体和存储库。我正在使用的查询连接所有三个表。我的第一个问题是

  1. 由于查询连接了所有三个表,我应该将此方法保留在哪个存储库类中?
  2. 查询没有锁定。 JQL 支持吗?
  3. 我拥有的三个实体是 Employee.java、EmployeePosition.java 和 EmployeeAction.java。

下面是我正在使用的 SQL 查询(本机查询)。能不能从原生查询转成 Spring Data JPA 查询语言?

SELECT
           A.EMPL_ID
         , A.HIRE_DT
FROM
           HR.EMPLOYEE A WITH(NOLOCK)
           INNER JOIN
                      HR.EMPLOYEE_POS B WITH(NOLOCK)
                      ON
                                 A.SEQ_NO = B.SEQ_NO
           INNER JOIN
                      HR.EMPLOYEE_ACN C WITH(NOLOCK)
                      ON
                                 A.SEQ_NO = C.SEQ_NO
WHERE
           A.EMPLOYEE_STATUS in ('ACTIVE')
           AND B.JOB_GRP='IT'
           AND C.ACN IN ('HIRE')
ORDER BY
           A.HIRE_DT ASC

【问题讨论】:

    标签: java spring-boot spring-data-jpa spring-data


    【解决方案1】:

    我强烈建议在 Spring Data JPA 中使用@Query 或@Native Query 来解决此类问题。

    只是为了阐明您的问题,

    1. 您应该创建一个 Employee 的 Spring Data JPA 存储库。但是另外两个仍然是Entity。存储库基本上代表聚合根的集合,它们又是您的一些实体,您将访问它们并对其他实体实施业务约束。例如,您有 EmployeeEmployeePosition 组成,Employee 是聚合根,因为它控制 EmployeePosition 等的生命周期。因此,您将为 Employee 定义一个存储库,而不是为 @987654331 @。因此,到目前为止,并非所有实体都会为其创建存储库。

    2. 您可以使用@Transactional(isolation = Isolation.READ_UNCOMMITTED)。但它在交易层面。在数据库级别使用@NativeQuery 对这种类型的东西更安全。

    3. 由于您在Entity 定义了所有关系,所以现在您可以直接使用JPA Query Methods 来获取数据。您可以使用Derived Query 来执行此操作。类似于

    List<Employee> findByEmployeePositionAndEmployeeActionAndStatus(EmployeePosition position, EmployeeAction action, String status)

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2020-07-04
      • 2014-12-06
      • 1970-01-01
      • 2017-11-29
      相关资源
      最近更新 更多