2016-01-16 39 views
1

我正在學習Criteria API,我遇到了一個問題來創建我的查詢。 這裏是我的結構:標準查詢2,通過3個實體級別查詢

的管理員擁有組的列表,A組有管理員列表(所以多對多關係)

A組有公司的名單,A公司擁有一批(所以一對多)

要找到一個管理員的所有組我創造了這個請求:

@Override 
public List<Group> getAllGroupsManagedByAdmin(Admin admin) 
{ 
final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
final CriteriaQuery<Group> query = cb.createQuery(Group.class); 
final Root<Admin> admins = query.from(Admin.class); 

query.where(cb.equal(admins.get(Admin_.id), admin.getId())) 
.select(admins.join(Admin_.groups)); 

return this.entityManager.createQuery(query).getResultList(); 
} 

現在我試圖找到一個組的所有公司,但可以肯定這組由參數提供的管理員負責管理,該方法的定義是:

public List<Company> getCompaniesByGroupIdManagedByAdmin(String groupId, Admin admin) 

但是我所有的草稿在這一刻都失敗了。有人能給我一些幫助嗎? 謝謝!

回答

1

由我自己最後發現,該解決方案更容易我所期待的:

public List<Company> getCompaniesByGroupIdManagedByAdmin(String groupId, Admin admin) 
{ 
    final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    final CriteriaQuery<Company> query = cb.createQuery(Company.class); 
    final Root<Admin> admins = query.from(Admin.class); 

    final Join<Admin, Group> groups = admins.join(Admin_.groups); 

    final Predicate[] predicates = new Predicate[2]; 

    predicates[0] = cb.equal(admins.get(Admin_.id), admin.getId()); 
    predicates[1] = cb.equal(groups.get(Group_.id), groupId); 

    query.where(predicates) 
    .select(groups.join(Group_.companies)); 

    return this.entityManager.createQuery(query).getResultList(); 
}