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();
}
我正在学习条件 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();
}