我知道必须有一个简单的方法来做到这一点,但目前还没有找到我。我有一个简单的实体(为了简洁而删除了不相关的部分):
@Entity
@Table(name = "reviews")
public class Review {
private String text;
private boolean approved;
private Collection<ReviewFlag> flags;
public Review() {
this.text = null;
this.approved = false;
this.flags = Collections.emptyList();
}
@Column(nullable = false)
public String getText() {
return text;
}
@Column(nullable = false)
public boolean isApproved() {
return approved;
}
@OneToMany(mappedBy="review")
public Collection<ReviewFlag> getFlags() {
return flags;
}
}
我想运行一个查询,查找带有两个或多个标志的每个未批准的审核。类似的东西:
SELECT r FROM Review r WHERE r.approved = 0 AND COUNT(r.flags) > 1
...但当然这种语法不起作用(hibernate抱怨语法)。我试过它:
SELECT r FROM Review r WHERE r.approved = 0 HAVING COUNT(r.flags) > 1
...一个人运行,但也返回有0或1个标志的评论。我需要使用什么神奇的调用来查找只有2个或更多标志的那个?
答案 0 :(得分:1)
由于注释,我假设您在可以使用JPQL而不是EJB QL的环境中运行。如果是这样,那么SIZE运营商就是出于这种目的。它将收集路径作为参数并返回元素数量。
在您的情况下,JPQL查询是:
SELECT r FROM Review r WHERE r.approved = 0 AND SIZE(r.flags) > 1
答案 1 :(得分:0)
我明白了:
SELECT DISTINCT(f.review) FROM Flag f WHERE f.review.hidden = 0 AND f.review.approved = 0 GROUP BY f.review HAVING COUNT(*) > 1
比我想要的更加迟钝,但它确实有效。
自我注意:停止回答自己的问题。