2017-12-29 52 views
0

주어진 id에 대한 엔티티를 검색하기 위해 Hibernate 쿼리를 작성하려고합니다. 이 개체는 다른 개체의 컬렉션을 가지고 있지만, 나는 단지 수집 채울 삭제되지 않은 개체를 검색 할 :왜이 항목을 가져 오지 않고 왼쪽 가져 오기 페치입니까?

최고 수준의 엔티티 :

@Entity 
@Table(name="rss_feed_definition") 
public class RSSFeedDefinition extends BaseEntity { 

    [...] 

    @OneToMany(mappedBy="rssFeedDefinitionId") 
    private Collection<RSSFeedProperty> rssFeedProperties; 

    [...] 

과 HQL :

em.createQuery("from RSSFeedDefinition definition left join fetch definition.rssFeedProperties property where property.deleted = false and definition.id = :id"); 

RSSFeedDefinition을 반환하지 않는 이유는 무엇입니까? (사실 ​​삭제 된 플래그가있는) 속성에 합류하게됩니다.

+0

'where' 절이 조인 된 테이블을 필터링하기 때문에. '왼쪽 결합 '에 그 조건을 포함시켜야합니다. –

+0

죄송합니다. 오류가 보이지 않습니다. 예제를 제공해 주시겠습니까? – crm

답변

0

나는 하이버 네이트 전문가 모르지만 순수한 SQL에 문제는 이것이다 :

select * 
from RSSFeedDefinition definition 
left join property on definition.someField = property.otherField 
where property.deleted = false <--- this is the problem because it filters all data 
and definition.id = :id 

그것은 다음과 같이해야 다음이 될 수 조인 할 때

select * 
from RSSFeedDefinition definition 
left join property on definition.someField = property.otherField 
        and property.deleted = false 
where definition.id = :id 

만 필터링 할 수 있습니다.

+0

지금까지 수집 한 내용에서 JPA는 가져 오기 필터링을 지원하지 않는 것으로 보입니다. 만약 내가 실수하지 않는다면 유일한 다른 대안은 2 가지 질의 일 것입니다. 가장 먼저 상위 엔티티를 가져오고 두 번째는 최상위 엔티티를 검색합니다. – crm

0

JPA는 JOIN FETCH 문에서 조건을 지원하지 않습니다. 그러나 귀하의 경우, 다음과 같은 해결 방법을 사용할 수 있습니다 : 정의와 연관된 속성이없는 경우

TypedQuery<RSSFeedDefinition> q = em.createQuery("SELECT definition FROM RSSFeedDefinition definition LEFT JOIN FETCH definition.rssFeedProperties property WHERE property.deleted = false or property.deleted = IS NULL and definition.id = :id", RSSFeedDefinition.class); 

를, 그 속성은 null입니다. 따라서 deletedfalse 또는 null인지 확인해야합니다.