"or" 语句中使用 JPA 为空

Using JPA is empty in "or" statement

我正在使用 spring-data-jpa 的 @Query 注释构建 JPA 查询,但无法使其正常工作。我有两个 classes class (setters/getters 剥离)

public class Article {
    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany(cascade = CascadeType.ALL)
    @OrderColumn(name = "review_index")
    private List<Review> reviews;
}

public class Review {
    @Id
    @GeneratedValue
    @Column(unique = true, nullable = false)
    private Integer id;

    @Column(name = "review_state")
    @Enumerated(EnumType.STRING)
    private ReviewState state;  // simple enum
}

它应该做什么:查询应该 return 所有 Article 并且 没有 审查或具有状态 PASSED.

的集合中具有最高索引的 Review
@Query("select distinct article from Article article "
    + "left outer join article.reviews r " // outer join to include articles without review
    // be sure to be either unreviewed or passed the review
    + "where (article.reviews is empty or article.reviews[maxindex(article.reviews)].state = 'PASSED'))"

它的实际作用: 问题是 Articles 根本没有审查就被排除在结果之外。似乎 article.reviews is empty 根本没有受到尊重。旁注:如果省略 or 语句的第二部分,is empty 有效。

从评论中提取的答案:

核心问题与路径导航的隐式连接(不是左连接)有关"article.reviews"。 这可以通过此部分的专用子 select 绕过。

select distinct article 
from Article article
left outer join article.reviews r 
where article.reviews is empty or 
    exists(
        select subArticle 
        from Article subArticle 
        where article.id = subArticle.id 
        and subArticle.reviews[maxindex(subArticle.reviews)].state = 'PASSED'
    )