2012-08-07 74 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