2014-01-17 1 views
2

최대 절전 모드 3.5를 사용 중이고 키워드가 포함 된 부모 개체를 반환하거나 자식 개체 중 하나에 예어. 여기 OR 부모 - 자식 연결에 대한 Hibernate Critera 질의

@Entity 
    @Table(name="cats") 
    public class Cat { 
     private String name; 
     private Set<Cat> kittens; 
    } 

Criteria Query 섹션에서 샘플 쿼리입니다 : 여기

Hibernate Documentation에서 고양이를 사용하는 예입니다

Criteria criteria = session.createCriteria(Cat.class) 
    .add(Restrictions.like("name", "F%") 
    .createAlias("kittens", "kits") 
    .addRestrictions.like("kits.name", "F%"); 
List<Cat> cats = criteria.list(); 

이는 고양이 개체를 반환 곳의 이름 parent는 F로 시작하고 새끼 고양이 중 하나의 이름은 F로 시작합니다. 이러한 제한의 논리적 분리를 반환하는 쿼리를 만들고 싶습니다. 고양이 이름이 F로 시작하는 고양이 또는 고양이의 이름이 F.로 시작하는 고양이 예 : (고양이 : [새끼 고양이]) 프리츠 : [], 프랭크 : [알, 배리], 찰리 : [프란]; 결과 집합에 모두 포함되어야합니다. Bob : []와 Mike : [Allen, Bosco]는 안됩니다.

몇 가지 다른 쿼리를 시도했지만 올바른 결과를 얻을 수 없었습니다.

Criteria criteria = session.createCritera(Cat.class) 
    .add(Restrictions.like("name", "F%); 

이 쿼리는 이름이 F.로 시작

Criteria criteria = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kits") 
    .add(Restrictions.like("kits.name", "F%"); 

이 쿼리는 이름 F. 내 문제가 시작하는 곳은 시작 새끼 고양이가있는 모든 부모 고양이를 반환 모든 부모 고양이를 반환, I 이 두 세트의 분리가 필요하다. 먼저 시도 :

Criteria.criteria = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kits") 
    .add(Restrictions.disjunction() 
     .add(Restrictions.like("name", "F%") 
     .add(Restrictions.like("kits.name", "F%"); 

이 쿼리는 작동하지 않습니다. 이전 쿼리와 마찬가지로 F로 시작하는 이름을 가진 자식이있는 부모 만 반환합니다.

Criteria.criteria = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kits") 
    .add(Restrictions.or(
     Restrictions.like("name", "F%"), 
     Restrictions.like("kits.name", "F%")); 

API 설명서를 올바르게 읽는 경우이 쿼리는 이전 쿼리와 동일합니다. 앞의 두 쿼리와 동일한 결과를 얻으므로 의미가 있습니다.

나는 조건 검색을 통해 정확한 고양이 세트를 얻는 방법으로 난처한 입장에 놓이게됩니다.

두 개의 개별 쿼리를 실행 한 다음 결과 컬렉션을 정리할 수 있다고 가정하지만 불필요하게 비효율적 인 것처럼 보입니다.

어떤 제안에 감사드립니다. 야옹.

답변

1

시도 : 작업을해야

Criteria.criteria = session.createCriteria(Cat.class) 
.createAlias("kittens", "kits", Criteria.LEFT_JOIN) 
.add(Restrictions.or(
    Restrictions.like("name", "F%"), 
    Restrictions.like("kits.name", "F%")); 

.

관련 문제