2011-08-09 2 views
2

je la requête SQL requête suivante:critères de mise en veille prolongée requête

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) 

C'est ce que j'ai écrit jusqu'à présent:

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

Comment puis-je écrire le « et » à l'intérieur des premiers supports et le "ou"?

+0

Avez-vous vérifié cela? http://www.roseindia.net/hibernate/examples/criteria/hibernate-criteria-and-or.html – Holm

+0

Oui, je l'ai vu. Mon problème est que j'ai besoin de mettre le "et" entre deux tables, et je ne sais pas comment faire cela. – jorgen

+0

utilisez les noms d'alias pour faire référence à la table. Vous n'avez pas besoin de toutes ces variables. Il est beaucoup plus lisible lorsqu'il est écrit dans un style fluide. –

Répondre

1

La structure que vous voulez pour

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

sera quelque chose comme:

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

J'ai juste rencontré cette question - j'ai le code exactement comme ceci ici, seulement les parenthèses ne sont jamais réellement incluses - donc la requête SQL génère totalement plate et donne des résultats invalides. Au moins - c'est sous PostgreSQL. –

0

Vous pouvez placer une première and à faire la jonction et une seconde comme:

//pseudo code 
tablea.foreignId = id 

tableb.id = id 
+0

Je comprends la logique, mais je ne sais pas comment écrire cela en Java. Pouvez-vous s'il vous plaît me donner un exemple en code Java? – jorgen

Questions connexes