2012-08-07 68 views
0

学生 - 课程:一对多如何使用Criteria编写以下JPQL?

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); 
+0

你的问题不清楚:JPQL,标准和你的描述做了3件不同的事情。你想得到什么?另外,如果一门课程后面有几个学生,那么你有一个ManyToMany,而不是OneToMany。 – 2012-08-07 07:30:42

回答

0

有一个在标准API没有JPA QL相当于“连接抓取”。

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

如果您使用的是标准api,您可以调用dao中child的getter方法,以便它被加载。

0

我希望你的学生实体与学生实体中的物业名称课程的课程映射有关系。

这里是条件查询

 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(); 
+0

@Thanks Rahul你可能是正确的,但我使用JPA标准。 – 2012-08-07 11:17:40