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;
    }
}

2つ以上のフラグを持つすべての未承認のレビューを見つけるクエリを実行したいと思います。何かのようなもの:

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つ以上のフラグを持つものだけを見つけるために使用する必要がある魔法の呼び出しは何ですか?

4

2 に答える 2

1

アノテーションがあるため、EJBQLの代わりにJPQLを使用できるような環境で操作していると思います。もしそうなら、SIZE演算子はこの種の目的のためにあります。引数としてコレクションへのパスを取り、要素の数を返します。

あなたの場合、JPQLクエリは次のとおりです。

SELECT r FROM Review r WHERE r.approved = 0 AND SIZE(r.flags) > 1
于 2012-05-17T08:25:51.660 に答える
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

私が望むより少し鈍いですが、それは機能します。

自己への注意:自分の質問に答えるのはやめましょう。

于 2012-05-17T04:57:05.343 に答える