SpringData :是否可以在查询注释中包含子查询?

2022-09-02 13:16:07

我想知道是否可以在@Query注释(org.springframework.data.jpa.repository.Query;)中使用子查询。

我在第一个子查询 parentesis 上得到了一个 QuerySyntaxException。

这是我的查询

@Query(value="select c1 from ComplaintModel c1, "
+ "(select c2.id, min(cb.termDate) minDate from ComplaintModel c2 "
+ "join c2.complaintBullets cb join cb.status s where s.code = ?1 "
+ "group by c2.id) tmp where c1.id = tmp.id order by tmp.minDate")

谢谢!


答案 1

不可以,在 JPQL 查询的 select 子句中不可能有子查询。

JPQL 支持 WHERE 和 HAVING 子句中的子查询。它可以(至少)是 ANY、SOME、ALL、IN、EXIST 表达式的一部分,当然它也可以用作普通条件表达式:

SELECT a
FROM A a
WHERE a.val = (SELECT b.someval 
               FROM B b 
               WHERE b.someotherval=3)

答案 2

我确实在Spring-data jpa中获得了预期的结果

public final static String FIND_BY_ID_STATE = "SELECT a FROM Table1 a RIGHT JOIN a.table2Obj b " +
                                              "WHERE b.column = :id" +
                                              "AND a.id NOT IN (SELECT c.columnFromA from a.table3Obj c where state = :state)";


@Query(FIND_BY_ID_STATE)
public List<Alert> findXXXXXXXX(@Param("id") Long id, @Param("state") Long state);

哪里

Table2Obj 和 Table3Obj 分别是实体 Table1 和 Table2,Table3 之间关系的映射。

定义如下。

@OneToMany(mappedBy = "xxx", fetch = FetchType.LAZY)
private Set<Table2> table2Obj = new HashSet<>();

推荐