如何使用与 JPA 存储库相同的 table 进行连接?

How can I do a join using the same table with JPA Repository?

我用 MySQL 写了这个查询,它有效:

select c.*
from macchine.check_list c
join (select pratica, documentazione, max(versione) as versione
      from macchine.check_list
      group by pratica, documentazione) c2
  on c.pratica = c2.pratica
  and c.documentazione = c2.documentazione
  and c.versione = c2.versione;

然后我尝试使用 JPA 存储库在我的网络应用程序上移动此查询:

@Query("select t1 from CheckList as t1 join "
        + "(select pratica, documentazione, max(versione) as versione from CheckList group by pratica, documentazione) as t2 "
        + "on t1.pratica = t2.pratica  and "
        + "t1.documentazione = t2.documentazione and "
        + "t1.versione = t2.versione")

但它不起作用,因为我知道,要创建与 JPA 存储库的连接,您必须执行以下操作:

form table1 t1 join t1.table2 t2 on etc.

但在这种情况下,我需要在同一个 table 上进行连接,那我该怎么做呢?

JPA 不支持 JOIN 内联视图。通过这种连接过滤结果的主要替代方法(在 JPQL 和 SQL 中)是通过 WHERE 子句中的相关子查询过滤结果:

select t1
from CheckList t1
where t1.versione = (
  select max(versione)
  from CheckList t2
  where t2.pratica = t1.pratica
    and t2.documentazione = t1.documentazione
)

您可以从 MySQL 中的子选择创建一个视图,然后将该视图映射到 Java 实体并在 CheckList 中添加必要的映射:

@OneToOne
@JoinColumns(
{
    @JoinColumn(name="pratica"),
    @JoinColumn(name="documentazione"),
    @JoinColumn(name="versione")
}
private MaxCheckList maxCheckList;

@Query("select t1 from CheckList as t1 join maxCheckList t2")

我解决了添加 nativeQuery = true.

所以这是我的查询:

@Query(value = "select t1.* from macchine.check_list as t1 join "
        + "(select pratica, documentazione, max(versione) as versione from macchine.check_list group by pratica, documentazione) as t2 "
        + "on t1.pratica = t2.pratica  and "
        + "t1.documentazione = t2.documentazione and "
        + "t1.versione = t2.versione where t1.pratica = :pratica", nativeQuery = true)

澄清一下,这是我的 table:

+----+----------------+---------+----------+---------+
| id | documentazione | pratica | versione | ....... |
+----+----------------+---------+----------+---------+
| 1  | 1              | 1       | 1        |         |
+----+----------------+---------+----------+---------+
| 2  | 2              | 1       | 1        |         |
+----+----------------+---------+----------+---------+
| 3  | 3              | 1       | 1        |         |
+----+----------------+---------+----------+---------+
| 4  | 1              | 1       | 2        |         |
+----+----------------+---------+----------+---------+

使用这个查询得到的结果是这样的:

+----+----------------+---------+----------+---------+
| id | documentazione | pratica | versione | ....... |
+----+----------------+---------+----------+---------+
| 4  | 1              | 1       | 2        |         |
+----+----------------+---------+----------+---------+
| 2  | 2              | 1       | 1        |         |
+----+----------------+---------+----------+---------+
| 3  | 3              | 1       | 1        |         |
+----+----------------+---------+----------+---------+