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

时间:2016-01-16 11:29:50

标签: java criteria-api

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

管理员有一个组列表,一个组有一个管理员列表(所以ManyToMany关系)

集团有公司名单,公司有一个集团(所以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 个答案:

答案 0 :(得分: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();
}