场景是:实体学生身份证件名称列出课程
实体课程身份证件名称学生
现在我需要学习课程"编程"的学生名单
如何使用条件查询实现这一点。
试试这个:
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();
在这个例子中,我假设您已经很好地建模了JPA实体,包括双向关系。如果是API,也建议您使用pojos而不是将JPA实体返回到web部件,为此,您应该使用多重选择,而不是选择并指定您想要获得的每个字段,但作为第一近似,这是有效的。
还建议为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();