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

어노테이션으로 인해 EJB QL 대신 JPQL을 사용할 수있는 환경에서 작업한다고 가정합니다. 그렇다면 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 

좀 더 둔한 내가 좋아하는 것보다,하지만 작동합니다.

참고 사항 : 독자적 질문에 응답하지 마세요.

관련 문제