EJBQL - 查找具有多个“x”关系的所有行

时间:2012-05-17 04:43:47

标签: java hibernate jpql ejbql

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

@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个或更多标志的那个?

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

比我想要的更加迟钝,但它确实有效。

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