我知道一定有一个简单的方法可以做到这一点,但目前还没有找到我。 我有一个简单的实体,例如(为简洁起见,删除了不相关的部分):
@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 个或更多标志的标志?
由于注释,我假设您在可以使用 JPQL 而不是 EJB QL 的环境中进行操作。如果是这样,那么 SIZE 运算符就是为了这种目的。它将集合路径作为参数并返回元素数。
在您的情况下,JPQL 查询是:
SELECT r FROM Review r WHERE r.approved = 0 AND SIZE(r.flags) > 1
我明白了:
SELECT DISTINCT(f.review) FROM Flag f WHERE f.review.hidden = 0 AND f.review.approved = 0 GROUP BY f.review HAVING COUNT(*) > 1
比我想要的更迟钝一些,但它有效。
自我注意:停止回答自己的问题。