2015-01-14 66 views
0

我有以下HQL查詢:LEFT JOIN與條件獲取失敗

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(); 

的問題是,在where子句中出現故障的情況下,例如,該查詢返回類別對象,其狀態爲1個類別對象其parentCategory不爲null,儘管我指定了上述限制!

+0

你可以給我們提供一個SQL小提琴的例子嗎? (http://sqlfiddle.com) – Smutje

+0

@Smutje這不是SQL。它是HQL(Hibernate查詢語言)。 –

+0

當離開外部聯接時,不要在WHERE子句的外部表上有條件,而是將它們移動到ON子句。 (如果在WHERE子句中,它不再是一個OUTER JOIN,只是一個常規的JOIN。) – jarlh

回答

2

如果您希望此查詢返回ProjectPage對象categorySet根據where條件篩選出來,那麼您的期望是錯誤的。如果ProjectPage具有給定ID的實例包含任何類別通過where子句的條件,它將作爲整體對象返回。這是設計的,因爲基礎機制,緩存等原因需要。如果您需要符合某些條件的類別對象,則必須爲此編寫單獨的查詢。

+0

對不起,你能解釋一下更多的是什麼意思嗎?如果我想在categorySet的每個對象上應用上述條件,我需要做什麼? –

+0

你必須在'Category'對象上查詢,而不是'ProjectPage'。就像'從類別c中選擇c,其中<類別條件>和c.projectPage.id =:id'。我知道的唯一方法就是使用[Hibernate filters](https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/filters.html)。 –

+0

好的,但我仍然不明白問題的原因,請向我解釋 –