2015-01-14 6 views
0

나는 다음과 같은 HQL 쿼리가 있습니다이 실패

return entityManager().createQuery(
    "SELECT page FROM ProjectPage page" 
    + " left join fetch page.categorySet as category    " 
    + " where page.id = :id " 
    + " and category.parentCategory is null " 
    + " and (category.status != :status_val) " 
    ,ProjectPage.class).setParameter("id", id) 
    .setParameter("status_val", 1).getSingleResult(); 

문제 조항이 실패 곳의 조건, 예를 들어, 쿼리가 그 상태 1, 카테고리 객체입니다 카테고리의 객체를 반환한다는 것입니다 위에 정의 된대로이 제약 조건을 지정했지만 parentCategory가 null이 아닙니다!

+0

SQL 바이올린 예제를 제공해 주시겠습니까? (http://sqlfiddle.com) – Smutje

+0

@Smutje SQL이 아닙니다. 그것은 HQL (Hibernate Query Language)입니다. –

+0

외부 조인을 그대로두면 WHERE 절의 외부 테이블에 조건이 없으므로 대신 ON 절로 이동하십시오. WHERE 절에서 더 이상 OUTER JOIN이 아닌 일반 JOIN이됩니다. – jarlh

답변

2

이 쿼리가 개체를 categorySet으로 필터링하여 where 조건을 기준으로 필터링하여 반환하면 기대치가 틀립니다. 제공된 ID가 ProjectPage 인 인스턴스가 where 절 조건을 통과하는 모든 범주를 포함하는 경우 전체 인스턴스로 이 반환됩니다. 이것은 의도적으로 설계된 것이며 기본 메커니즘, 캐싱 등으로 인해 필요합니다. 일부 조건을 충족하는 범주 개체가 필요한 경우 별도의 쿼리를 작성해야합니다.

+0

죄송합니다. 전체 개체가 의미하는 바를 더 자세히 설명해 주시겠습니까? categorySet의 모든 객체에 위의 조건을 적용하려면 어떻게해야합니까? –

+0

'Project' 대신'Category' 객체를 쿼리해야합니다. 'category condition> 및 c.projectPage.id = : id'에서'c를 category c에서 선택하십시오 '와 같은 것입니다. 내가 아는 유일한 방법은 [Hibernate filters] (https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/filters.html)를 사용하는 것입니다. –

+0

오케이,하지만 여전히 문제의 원인을 이해하지 못했습니다. 제게 설명해주세요. –