如何使用Criteria编写以下JPQL?

时间:2012-08-07 03:30:38

标签: java hibernate jpa-2.0

学生 - 课程:OneToMany

JPQL:

  

从学生中选择学生,课程在哪里   student.name =:STUDENTNAME和(course.courseName =:COURSENAME或   course.courseDuration = courseDuration)

让我们假设一名学生可能有10门课程,我只想找回两份有学生课程的记录(2)。

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class);
Root<Student> studentRoot = criteriaQuery.from(Student.class);
studentRoot.fetch("courses", JoinType.LEFT);
Predicate condition = criteriaBuilder.equal(studentRoot.get("studentName"), "someName");
//how to add course condition here.
criteriaQuery.where(condition);

2 个答案:

答案 0 :(得分:0)

我希望您的学生实体与课程映射与学生实体中的属性名称课程有关。

这是Criteria Query

        Criteria criteria = getSession().createCriteria(Student.class);
        criteria.createAlias("course", "course");
        criteria.add(Restrictions.eq("name", STUDENTNAME));        
        Criterion courseNameCrit = Restrictions.eq("course.courseName", courseName);
        Criterion courseDurationCrit = Restrictions.eq("course.courseDuration", courseDuration);
        criteria.add(Restrictions.disjunction().add(courseNameCrit).add(courseDurationCrit));    
        List<Student> studentList = criteria.list();

答案 1 :(得分:0)

Criteria API中没有等效的JPA QL“JOIN FETCH”。

JOIN FETCH使用EAGER提取,而不管模型注释中指定的提取类型。

如果使用条件api,可以在dao中调用child的getter方法,以便加载它。