在不同级别上使用多个 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();
这很好用,但是如何将 类别 添加到此查询? 类别是类型的属性,我要查询所有项目
- 属于类型列表(在示例中工作)
- AND属于类别列表中的一个类型(此问题的原因)
正如您在 JPQL 中需要它们一样(如果查询是静态查询,我建议使用它,因为它更简单且更具可读性),您需要连接:
Join<Project, Type> type = project.join("type");
Join<Type, Category> category = type.join("category");
cQ.where(type.in(types), category.in(categories));
(未测试)
我有这些(简化的)实体:
@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();
这很好用,但是如何将 类别 添加到此查询? 类别是类型的属性,我要查询所有项目
- 属于类型列表(在示例中工作)
- AND属于类别列表中的一个类型(此问题的原因)
正如您在 JPQL 中需要它们一样(如果查询是静态查询,我建议使用它,因为它更简单且更具可读性),您需要连接:
Join<Project, Type> type = project.join("type");
Join<Type, Category> category = type.join("category");
cQ.where(type.in(types), category.in(categories));
(未测试)