我正在学习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)
但此时我的所有草稿都失败了。有人可以给我一些帮助吗? 谢谢!
答案 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();
}