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

... но, конечно, этот синтаксис не работает (спящий режим жалуется на синтаксис). Я пробовал это как:

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

... который запускается, но также возвращает отзывы с флагами 0 или 1. Какой магический вызов мне нужно использовать, чтобы найти только те, у кого 2 или более флагов?

2 ответа

Решение

Из-за аннотаций я предполагаю, что вы работаете в такой среде, где вместо EJB QL можно использовать JPQL. Если это так, то оператор SIZE существует для этой цели. Он принимает путь к коллекции в качестве аргумента и возвращает количество элементов.

В вашем случае JPQL-запрос:

SELECT r FROM Review r WHERE r.approved = 0 AND SIZE(r.flags) > 1

Я понял:

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

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

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

Другие вопросы по тегам