2012-05-17 40 views
0

我知道必須有一種簡單的方法來做到這一點,但目前它並沒有提供給我。我有一個簡單的實體一樣(爲了簡潔去除不相關部分):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 

...但當然是語法不工作(休眠抱怨語法)。我試過它:

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

...一個運行,但也返回有0或1標誌的評論。我需要使用什麼魔法調用才能找到帶有2個或更多標誌的魔法調用?

回答

1

由於註釋的原因,我假定您在JPQL可以用來代替EJB QL的環境中運行。如果是這樣,那麼SIZE運營商就是出於這種目的。它將收集路徑作爲參數並返回元素的數量。

在你的情況JPQL查詢:

SELECT r FROM Review r WHERE r.approved = 0 AND SIZE(r.flags) > 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 

更有點鈍,比我想的,但它的工作原理。

給自己的注意事項:不要回答自己的問題。

相關問題