0

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

@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

...但当然该语法不起作用(休眠抱怨语法)。我已经尝试过:

SELECT r FROM Review r WHERE r.approved = 0 HAVING COUNT(r.flags) > 1

...运行,但也返回具有 0 或 1 个标志的评论。我需要使用什么魔法调用来仅查找具有 2 个或更多标志的那些?

4

2 回答 2

1

由于注释的原因,我假设您在可以使用 JPQL 而不是 EJB QL 的环境中操作。如果是这样,那么SIZE运算符就是为了这种目的而存在的。它将集合的路径作为参数并返回元素的数量。

在您的情况下,JPQL 查询是:

SELECT r FROM Review r WHERE r.approved = 0 AND SIZE(r.flags) > 1
于 2012-05-17T08:25:51.660 回答
0

I got it:

SELECT DISTINCT(f.review) FROM Flag f WHERE f.review.hidden = 0 AND f.review.approved = 0 GROUP BY f.review HAVING COUNT(*) > 1

A bit more obtuse than I'd like, but it works.

Note to self: stop answering own questions.

于 2012-05-17T04:57:05.343 回答