2016-06-26 1 views
3

세 개의 항목이 있습니다. 사람들은 :이 세 기관에서엔티티 관계가 직접적이지 않은 최대 절전 기준을 사용하여 여러 테이블에 가입하는 방법은 무엇입니까?

@Entity 
public class Organization { 
    @Id 
    private long id; 
    @Column 
    private String name; 
} 
@Entity 
public class Book { 
    @Id 
    private Long id; 
    @Column 
    private String name; 
    @ManyToOne 
    private Organization organization; 
} 
@Entity 
public class Account { 
    @Id 
    private Long id; 
    @Column 
    private String name; 
    @ManyToOne 
    private Book book; 
} 

나는 SQL 다음을 수행하려는 :이 경우

SELECT acc.name, acc.id 
FROM account acc 
JOIN book b on acc.book_id = b.id 
JOIN organization org on b.organization_id = org.id 
WHERE org.name = 'XYZ' 

Account 기업이 직접 Organization 단체와 아무 관계가 없습니다. Account 엔티티는 Book을 통해 관계를가집니다. 최대 절전 조건 동적 쿼리를 사용하여이를 어떻게 수행 할 수 있습니까?

답변

8

다음과 같이 할 수 있습니다

Criteria accountCriteria = getCurrentSession().createCriteria(Account.class,"acc"); 
Criteria bookCriteria = accountCriteria .createCriteria("book","b"); 
Criteria orgCriteria = bookCriteria.createCriteria("organization","org"); 
orgCriteria.add(Restrictions.eq("name", "XYZ")); 

ProjectionList properties = Projections.projectionList(); 
properties.add(Projections.property("name")); 
properties.add(Projections.property("id")); 

accountCriteria.setProjection(properties); 
accountCriteria.list(); 
+0

? 그것은'criteria.createCriteria ("book", "b");''criteria' 객체가 초기화되는 줄에 있습니까? – seal

+0

죄송합니다. 나는 accountCriteria에서 대답을 편집했습니다. – jpprade

+0

감사합니다. 나는 또한 그것을 알아 냈다. :) – seal

8

또 다른 방법은`criteria` 출처 않습니다

public List<Account> getAccountListByOrgName(String name){ 
    return sessionFactory.getCurrentSession().createCriteria(Account.class) 
       .createAlias("book", "book") 
       .createAlias("book.organization", "organization") 
       .add(Restrictions.eq("organization.name", name)) 
       .list(); 
}