2012-08-15 2 views
0

다음과 같은 클래스가 있다고 가정 해 봅시다 (간결성을 위해 getter/setter가 생략되었습니다). 나는 말한다 쿼리를 실행하려면 최대 절전 모드 기준을 사용Hibernate Criteria

public class Record{ 

     // ... properties 
     private Metadata metadata; 

     @OneToOne(cascade=CascadeType.ALL) 
     @PrimaryKeyJoinColumn 
     public Metadata getMetadata(){ 
      return metadata; 
     } 

    } 


    public class Metadata { 

     private Boolean enabled = false; 

     private Record record; 

     @OneToOne 
     @PrimaryKeyJoinColumn 
     public getRecord() { 
      return record; 
     } 

     @Column("enabled") 
     public Boolean getEnabled() { 
      return enabled; 
     } 
    } 

'나에게 널 (null) 메타 데이터 또는 사용할 수 없습니다 메타 데이터가 모든 레코드주세요'. 당분간 내 코드는 다음을 수행합니다.

List results = session().createCriteria(Record.class).list(); 

// iterate over results, pluck out the Records that match my criteria 

...하지만 더 잘 할 수 있습니까?

메타 데이터의 별칭을 만들고 앨리어스가 null인지 확인하려고했거나 alias.property가 내 조건 (즉, Restrictions.eq ("metadata.enabled", false)과 일치하는지 확인하려고했으나 ' t 작업. 또한 찾고있는 두 조건 (메타 데이터 null 또는 메타 데이터를 사용할 수 없습니다.)에 의해 내 결과를 필터링하려면 분리를 사용하려고 시도. 이러한 접근 방식 중 어느 쪽도 작동하지; 나는 그것을 시도하기 때문에 그 가정합니다 . 내가 할 수 있다면 그것은 나를 위해이에 도움이 되거하시기 바랍니다 것으로 예상되는 방식으로 결합되지 않은 기준으로 할

답변

1

을이 같은 아마 뭔가 :.

Criteria crit = session().createCriteria(Record.class); 
crit.add(Restrictions.disjunction() 
     .add(Restrictions.isNull("metadata")) 
     .add(Restrictions.eq("metadata.enabled", false)) 
); 
List results = crit.list(); 

또는

List results = session().createCriteria(Record.class) 
    .add(Restrictions.or(
     Restrictions.eq("metadata.enabled", false), 
     Restrictions.isNull("metadata") 
    )).list(); 
+0

네, 이것은 제가 처음으로 구현 한 것입니다. 이것은 작동하지 않았다. 사람들이 이것이 확실히 올바른 접근이라고 말할 수 있다면 내 문제는 다른 곳에서해야합니다. – zmf

+0

DetachedCriteria (스프링 사용)를 사용할 때 개인적으로 중첩 된 속성에 문제가있었습니다. 문제가 무엇인지 파악하지 못했습니다 ... 특정 엔터티에 하위 기준을 만들어 추가 필터링을 수행해야했습니다. – Less

관련 문제