如何使用与 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 | |
+----+----------------+---------+----------+---------+
我用 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 | |
+----+----------------+---------+----------+---------+