2012-01-29 3 views
1

I가 다음과 같은 모델 클래스 : 나는 다음과 같은 SQL에 해당하는 기준 쿼리를 작성하려는논리 OR 기준 및 기준 사이

@Entity 
@Table(name = "title") 
public final class Title extends ModelData<Title> 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer titleID; 

    @Column(name = "title") 
    private String title; 

    @Column(name = "description") 
    private String description; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "title") 
    private Set<Book> books; 
} 

@Entity 
@Table(name = "book") 
public final class Book extends ModelData<Book> 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "bookID") 
    private int bookID; 

    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) 
    @JoinColumn(name = "titleID") 
    private Title title; 

    @Column(name = "edition") 
    private Integer edition; 

    @Column(name = "isbn") 
    private String ISBN; 
} 

;

Criteria c = session.createCriteria(Book.class); 

Criteria titleCriteria = c.createCriteria("title"); 
titleCriteria.add(Restrictions.like("title", "%Java%"); 

Criterion edition = Restrictions.eq("edition", 4); 

LogicalExpression orExp = Restrictions.or(edition, titleCriteria); //cannot do this 

어떻게 위를 달성 않습니다

Select 
     t.title, b.edition 
    from 
     books b, title t 
    where 
     b.titleID = t.titleID 
    and 
     (b.edition=4 OR t.title LIKE '%Java%); 

나는 다음과 같은 시도?

감사합니다.

답변

1
public class MyDTO { 
    private String dtoTitle; 
    private String dtoEdition; 
    // + setters/getters 
} 


Criteria c = session.createCriteria(Book.class,"b"); 
c.createAlias("title", "t"); 
c.add(
    Restrictions.disjunction() 
    .add(Restrictions.like("t.title", "%Java%")) 
    .add(Restrictions.eq("b.edition", 4)) 
); 
c.setProjection( 
    Projections.projectionList() 
    .add(Projections.property("t.title"), "dtoTitle") 
    .add(Projections.property("b.edition"), "dtoEdition") 
); 
c.setResultTransformer(Transformers.aliasToBean(MyDTO.class)); 
List<MyDTO> result = (List<MyDTO>)c.list(); 

뭔가 잘 작동합니다.

많은 기준을 사용하는 DAO에서는 정적 가져 오기 사용을 고려해야합니다.

0

나는 이것을 원한다고 생각합니다. 나는 그것을 테스트하지 않았으므로 사소한 오류가있을 수 있지만 기본 아이디어는 옳다. 2 개 이상의 OR 조건

Criteria c = session.createCriteria(Book.class); 
Criterion titleCriterion = Restrictions.like("title.title", "%Java%"); 
Criterion edition = Restrictions.eq("edition", 4); 
c.add(Restrictions.or(edition, titleCriterion)); 
+0

당신이했던 것처럼 관련 엔티티에 대한 제한을 추가 할 수 있습니까? 비둘기. 위의 시도했는데 다음 예외가 발생합니다 :'org.hibernate.QueryException : 속성을 확인할 수 없습니다 : title.title : com.maximus.db.model.Book' –

+0

예, 이런 종류의 작업을 수행했습니다. 과거의 일 이었기 때문에 왜 작동하지 않는지 알 수 없었습니다. 덧붙여 말하자면,이 쿼리에 HQL을 사용할 수없는 이유가 무엇입니까? 그렇게하는 것이 더 쉽습니다. –

0

는 사용하기 더 읽기의이 같은

c.add(
    Restrictions.disjunction() 
      .add(Restrictions.eq(...)) 
      .add(Restrictions.eq(...)) 
      .add(Restrictions.eq(...)) 
    ) 
1

또 다른 아이디어

변환 수식 필드에 행해져 Yout 기준 및 평가 정상 criterios 수업 후

<property name="titlename" type="string" 
formula="(Select title.title from title 
    where title.titleID= titleID)"/> 

Criteria c = session.createCriteria(Book.class) 
Criteria titleCriteria = c.createCriteria("title"); 
titleCriteria.add(Restrictions.like("titlename", "%Java%"); 
Criterion edition = Restrictions.eq("edition", 4); 
LogicalExpression orExp = Restrictions.or(edition, titleCriteria); //CAN< do this!!! 

매핑 파일에 수식 필드를 추가하거나 주석