EJBQL - 查找具有'x'以上关系的所有行



我知道一定有一个简单的方法可以做到这一点,但目前还没有找到我。 我有一个简单的实体,例如(为简洁起见,删除了不相关的部分):

@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

比我想要的更迟钝一些,但它有效。

自我注意:停止回答自己的问题。

相关内容

  • 没有找到相关文章

最新更新