2012-05-17 4 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 

Чуть более тупые, чем хотелось бы, но это работает.

Примечание для себя: прекратите отвечать на собственные вопросы.

Смежные вопросы