JPA Criteria在不同级别上使用多个IN查询

时间:2015-01-24 08:21:44

标签: java jpa criteria-api

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

@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属于类别列表中的类型(此问题的原因)

1 个答案:

答案 0 :(得分:2)

就像你在JPQL中需要它们一样(如果查询是静态查询,我建议使用它,因为它更简单,更易读),你需要加入:

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

(未经测试)