在不同级别上使用多个 IN 的 JPA 条件查询

JPA Criteria Query with multiple IN on different levels

我有这些(简化的)实体:

@Entity public class Project
{
  @ManyToOne private Type type;
}

@Entity public class Type
{ 
  @ManyToOne private Category category;
}

@Entity public class Category
{ 
}

不,我想查询属于具有 CriteriaQuery 的选定类型的所有项目。

List<Type> types = ...
List<Category> categories = ...

CriteriaBuilder cB = em.getCriteriaBuilder();
CriteriaQuery<MeisProject> cQ = cB.createQuery(Project.class);
Root<Project> project = cQ.from(Project.class);

cQ.where(cB.isTrue(project.get("type").in(types)));

cQ.select(project).distinct(true);  
return em.createQuery(cQ).getResultList();

这很好用,但是如何将 类别 添加到此查询? 类别类型的属性,我要查询所有项目

正如您在 JPQL 中需要它们一样(如果查询是静态查询,我建议使用它,因为它更简单且更具可读性),您需要连接:

Join<Project, Type> type = project.join("type");
Join<Type, Category> category = type.join("category");
cQ.where(type.in(types), category.in(categories));

(未测试)