запрос критериев гибернации

У меня есть следующий запрос 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);

Как я могу написать «и» внутри первых скобок и «или»?


person jorgen    schedule 09.08.2011    source источник


Ответы (2)


Структура, которую вы хотите для

((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)
)
person EkcenierK    schedule 12.08.2011
comment
Только что наткнулся на этот вопрос - у меня есть точно такой же код, только скобки никогда не включаются, поэтому SQL-запрос генерирует совершенно плоский и дает неверные результаты. По крайней мере — это под PostgreSQL. - person Mark Derricutt; 22.10.2014

Вы можете разместить первый and для соединения, а второй, например:

//pseudo code
tablea.foreignId = id

tableb.id = id
person ssedano    schedule 09.08.2011
comment
Я понимаю логику, но не знаю, как это написать на Java. Не могли бы вы привести пример в java-коде? - person jorgen; 10.08.2011