2016-06-26 1 views
3

私は3つのエンティティを持っています。それらは以下のとおりです。これらの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です。 hibernate criteria動的クエリを使用してこれをどのように達成できますか?

答えて

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(); 
} 
関連する問題