2016-01-16 2 views
1

Я изучаю API-интерфейс Criteria, я сталкиваюсь с проблемой для создания моего запроса. Вот моя структура:Критерии Query 2, запрос через 3 объекта level

админ имеет список групп, группа имеет список администраторов (так ManyToMany отношения)

A Group имеет список компаний, компания имеет одну группу (так OneToMany)

чтобы найти все группы качестве администратора Я создал этот запрос:

@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(); 
} 
Смежные вопросы