Java 如何使用条件查询查询Spring JPA中的一对多关系

Java 如何使用条件查询查询Spring JPA中的一对多关系,java,spring,jpa,hibernate-criteria,criteriaquery,Java,Spring,Jpa,Hibernate Criteria,Criteriaquery,情况是: 实体学生 身份证件 名称 列出课程 实体课程 身份证件 名称 学生 现在我需要学习“编程”课程的学生名单 如何使用条件查询实现此目标。尝试以下方法: CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Student> cq = cb.createQuery(Student.class); Root<Student> rootStudent = cq.from(Stude

情况是: 实体学生 身份证件 名称 列出课程

实体课程 身份证件 名称 学生

现在我需要学习“编程”课程的学生名单

如何使用条件查询实现此目标。

尝试以下方法:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Student> cq = cb.createQuery(Student.class);

Root<Student> rootStudent = cq.from(Student.class);
Join<Student,Course> joinCourse = rootStudent.join("courses",JoinType.INNER);

cq.where(cb.equals(joinCourse.get("Name"),"Proggraming"));
cq.select(rootStudent);

List<Student> res = entityManager.createQuery(cq).getResultList();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Student.class);
Root rootStudent=cq.from(Student.class);
Join-joinCourse=rootStudent.Join(“课程”,JoinType.INNER);
cq.式中(cb.等于(joinCourse.get(“名称”),“编程”);
cq.select(rootStudent);
List res=entityManager.createQuery(cq.getResultList();
在本例中,我假设您对JPA实体进行了良好的建模,包括双向关系。如果API使用POJO而不是将JPA实体返回到web部件,则也建议您使用multiselect,而不是选择并指定要获取的每个字段,但作为第一近似值,它是有效的

还建议对JPA实体使用元模型,而不是通过名为(join,get methods..)的字符串访问属性

在这种情况下,进行子查询是没有意义的,我更改查询以通过子查询查找课程Proggraming1或Proggraming2的学生(我仍然希望通过过滤连接而不使用子查询),它将是这样的:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Student> cq = cb.createQuery(Student.class);

Root<Student> rootStudent = cq.from(Student.class);
Join<Student,Course> joinCourse = rootStudent.join("courses",JoinType.INNER);

Subquery<Long> subqueryIdCourse = cq.subquery(Long.class);
Root<Course> rootCourseSq = subqueryIdCourse.from(Course.class);
subqueryIdCourse.where(
    cb.or(
        cb.equals(rootCourseSq.get("Name"),"Proggraming1"),
        cb.equals(rootCourseSq.get("Name"),"Proggraming2")))
subqueryIdCourse.select(rootCourseSq.get("ID"))

cq.where(joinCourse.get("ID").in(subqueryIdCourse.getSelection()));
cq.select(rootStudent);

List<Student> res = entityManager.createQuery(cq).getResultList();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Student.class);
Root rootStudent=cq.from(Student.class);
Join-joinCourse=rootStudent.Join(“课程”,JoinType.INNER);
Subquery subqueryIdCourse=cq.Subquery(Long.class);
Root rootCourseSq=子查询的课程.from(Course.class);
subqueryIdCourse.where(
cb.or(
cb.equals(rootCourseSq.get(“Name”),“programing1”),
cb.equals(rootCourseSq.get(“Name”),“programing2”))
subqueryIdCourse.select(rootCourseSq.get(“ID”))
cq.where(joinCourse.get(“ID”).in(subqueryIdCourse.getSelection());
cq.select(rootStudent);
List res=entityManager.createQuery(cq.getResultList();
试试这个:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Student> cq = cb.createQuery(Student.class);

Root<Student> rootStudent = cq.from(Student.class);
Join<Student,Course> joinCourse = rootStudent.join("courses",JoinType.INNER);

cq.where(cb.equals(joinCourse.get("Name"),"Proggraming"));
cq.select(rootStudent);

List<Student> res = entityManager.createQuery(cq).getResultList();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Student.class);
Root rootStudent=cq.from(Student.class);
Join-joinCourse=rootStudent.Join(“课程”,JoinType.INNER);
cq.式中(cb.等于(joinCourse.get(“名称”),“编程”);
cq.select(rootStudent);
List res=entityManager.createQuery(cq.getResultList();
在本例中,我假设您对JPA实体进行了良好的建模,包括双向关系。如果API使用POJO而不是将JPA实体返回到web部件,则也建议您使用multiselect,而不是选择并指定要获取的每个字段,但作为第一近似值,它是有效的

还建议对JPA实体使用元模型,而不是通过名为(join,get methods..)的字符串访问属性

在这种情况下,进行子查询是没有意义的,我更改查询以通过子查询查找课程Proggraming1或Proggraming2的学生(我仍然希望通过过滤连接而不使用子查询),它将是这样的:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Student> cq = cb.createQuery(Student.class);

Root<Student> rootStudent = cq.from(Student.class);
Join<Student,Course> joinCourse = rootStudent.join("courses",JoinType.INNER);

Subquery<Long> subqueryIdCourse = cq.subquery(Long.class);
Root<Course> rootCourseSq = subqueryIdCourse.from(Course.class);
subqueryIdCourse.where(
    cb.or(
        cb.equals(rootCourseSq.get("Name"),"Proggraming1"),
        cb.equals(rootCourseSq.get("Name"),"Proggraming2")))
subqueryIdCourse.select(rootCourseSq.get("ID"))

cq.where(joinCourse.get("ID").in(subqueryIdCourse.getSelection()));
cq.select(rootStudent);

List<Student> res = entityManager.createQuery(cq).getResultList();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Student.class);
Root rootStudent=cq.from(Student.class);
Join-joinCourse=rootStudent.Join(“课程”,JoinType.INNER);
Subquery subqueryIdCourse=cq.Subquery(Long.class);
Root rootCourseSq=子查询的课程.from(Course.class);
subqueryIdCourse.where(
cb.or(
cb.equals(rootCourseSq.get(“Name”),“programing1”),
cb.equals(rootCourseSq.get(“Name”),“programing2”))
subqueryIdCourse.select(rootCourseSq.get(“ID”))
cq.where(joinCourse.get(“ID”).in(subqueryIdCourse.getSelection());
cq.select(rootStudent);
List res=entityManager.createQuery(cq.getResultList();

我们可以使用子查询实现相同的结果吗?我编辑了响应可以使用子查询实现相同的结果吗?我编辑了响应