"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'
)
我正在使用 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'
)