Criteria Query 2,通过3个实体级别查询

Criteria Query 2, query through 3 entities level

我正在学习条件 API,我在创建查询时遇到问题。 这是我的结构:

一个管理员有一个组列表,一个组有一个管理员列表(多对多关系)

一个集团有一个公司列表,一个公司有一个集团(所以 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)

但是此时我所有的草稿都失败了。有人可以帮我吗? 谢谢!

终于自己找到了,解决方案比我预期的更简单:

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();
}