2011-05-11 4 views
0

최대 절전 모드를 사용하여 "in"쿼리를 만들려고합니다. 내가 얻을 시도하고이 언어를 모르는 모든 사람, 그래서 보이는 개체가 같은 : Hibernate "not in"문제

Criteria cr = createCriteriaForPerson() // created criteria 

cr.createCriteria("languages").add(Restrictions.not(Restrictions.in("id", values))); 

등이 수익률을 보이는

public class Person { 
    ... 
    private List<Language> languages; 
    ... 
} 

public class Language { 

    public Long id; 
    public String label; 
} 

내 기준 코드 언어를 가진 사람을 포함한 모든 사람.

내가 특정 언어를 알고있는 사람을 검색하려고하면, 다음에 해당하는 쿼리는 문제가 될 수 무엇을 올바른 결과

Criteria cr = createCriteriaForPerson() // created criteria 

cr.createCriteria("languages").add(Restrictions.in("id", values)); 

을 반환?

덕분에 Makis

답변

2

난 당신이 sqlRestriction를 사용하지 않고 기준 API에서이 질의를 표현할 수 없다는 확신 해요.

나이브 방법은 다음과 같이 쿼리를 생성합니다

select p from Person p join p.languages l where l.id not in :values 

그것은 다른 언어가 여전히 선택되어 있기 때문에 당신이 원하는 것을 분명히 아니다.

은 지원하지 않습니다 기준 API 추가 조건을 조인 때문에

select p from Person p left join p.languages l with l.id in :values where l is null 

또는 하위 쿼리,이 쿼리를 표현하는 유일한 방법은

select p from Person p where not exists 
    (select l from Language l where l in elements(p.languages) and l.id in :values) 

입니다

가입 당신이 복잡한 필요 원하는 쿼리를 표현하려면 sqlRestriction을 하위 쿼리와 함께 사용하십시오 (하위 스키마의 형식은 데이터베이스 스키마에 따라 다릅니다).

cr.add(Restrictions.sqlRestriction(
    "not exists (select ... where l.person_id = {alias}.id and ...)"));