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
Немного тупее, чем хотелось бы, но это работает.
Примечание для себя: перестань отвечать на свои вопросы.