Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不同级别上具有多个IN的JPA条件查询_Java_Jpa_Criteria Api - Fatal编程技术网

Java 不同级别上具有多个IN的JPA条件查询

Java 不同级别上具有多个IN的JPA条件查询,java,jpa,criteria-api,Java,Jpa,Criteria Api,我有这些(简化的)实体: @Entity public class Project { @ManyToOne private Type type; } @Entity public class Type { @ManyToOne private Category category; } @Entity public class Category { } 否我想用标准查询查询属于所选类型的所有项目 List<Type> types = ... List<Cate

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

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

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

@Entity public class Category
{ 
}
否我想用
标准查询
查询属于所选类型的所有项目

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();
列表类型=。。。
列表类别=。。。
CriteriaBuilder cB=em.getCriteriaBuilder();
CriteriaQuery cQ=cB.createQuery(Project.class);
根项目=cQ.from(project.class);
cQ.where(cB.isTrue(project.get(“type”).in(types));
cQ.select(project).distinct(true);
返回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));
Join type=project.Join(“类型”);
连接类别=类型。连接(“类别”);
cQ.where(类型in(类型),类别in(类别));

(未测试)

查询应该做什么?你没有说过。项目没有类别,所以它不可能是相似的。查询是否应该按类别进行更多限制?它是否应该接受属于给定类别的项目,即使它们不属于给定类型?我们猜不到。说得准确一点。对不起,这个问题不准确。更新:“属于类别列表中的类型”。类别是该类型的属性。我们不必关心类别是否不在给定的类型中。