2011-08-09 81 views
2

我有以下查詢SQL查詢:休眠條件查詢

select * from Articles ar 
left join ArticleTeamRelationships atr on atr.ArticleId = ar.ArticleId 
left join Team te on te.TeamId = atr.TeamId 
inner join ArticleCategoryRelationships acr on acr.ArticleId = ar.ArticleId 
inner join ArticleCategory ac on ac.CategoryId = acr.CategoryId 
where ac.CategoryId = 3 
and ((te.TeamId in (1) and ar.TeamReadOnly = 1) or te.TeamId is null) 

這是我到目前爲止已經寫的:

Criteria childCriteriaCategory = criteria.createCriteria("articleCategory", Criteria.INNER_JOIN); 
childCriteriaCategory.add(Restrictions.like("categoryId", categoryId)); 
Criteria childCriteriaTeam = criteria.createCriteria("team", Criteria.LEFT_JOIN);  
childCriteriaTeam.add(Restrictions.in("teamId", teamId)); 
Criterion teamReadOnly = Restrictions.eq("teamReadOnly", true); 
criteria.add(teamReadOnly); 

我怎麼能寫「和」第一個括號內和「或」?

+0

你檢查過了嗎? http://www.roseindia.net/hibernate/examples/criteria/hibernate-criteria-and-or.html – Holm

+0

是的,我見過它。我的問題是我需要在兩個表格之間放置「和」,我不知道如何做到這一點。 – jorgen

+0

使用別名來引用表。你不需要所有這些變量。以流利的風格編寫時,它更具可讀性。 –

回答

1

你想爲

((te.TeamId in (1) and ar.TeamReadOnly = 1) or te.TeamId is null) 

將成爲結構是這樣的:

Restrictions.or(
    Restrictions.and(
     Restrictions.in(x, x), Restrictions.eq(x, x) 
    ), 
    Restrictions.eq(x,x) 
) 
+0

剛剛遇到了這個問題 - 我在這裏有完全這樣的代碼,只有括號永遠不會被包含 - 所以SQL查詢生成完全平坦併產生無效結果。至少 - 這是在PostgreSQL下。 –

0

您可以將第一and做加盟,第二個像:

//pseudo code 
tablea.foreignId = id 

tableb.id = id 
+0

我理解這個邏輯,但我不知道如何用Java寫這個。你能給我一個在java代碼中的例子嗎? – jorgen