2012-02-25 2 views
5

У меня есть два объекта с отношением OneToMany. Чтобы сделать его простым, давайте предположим, что они - Школа и Студенты, с однонаправленными отношениями от школы к учащимся. Я хочу найти объект школы, в котором есть конкретный ученик (студент с определенным возрастом, именем, ssn, ...). Я знаю, что я могу создать простой критерий, как следующие за свойство простых Школы (для названия школы, как следующее):JPA CriteriaQuery OneToMany

ParameterExpression<String> p = criteriaBuilder.parameter(String.class, "schoolName"); 
      criteria = criteriaBuilder.and(criteria, criteriaBuilder.like(schoolRoot.get("schoolName") , p)); 
queryResult.setParameter("schoolName", schoolName + "%"); 

, но, как я могу запросить студент с определенным значением свойства в то время как студенты в представленный как java.util.List, а не как основное свойство?

Может ли кто-нибудь помочь мне понять это? Надеюсь, я смог объяснить свою проблему.

Благодаря

ответ

4
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder(); 
CriteriaQuery<School> query = criteriaBuilder.createQuery(School.class); 
Root<School> schoolRoot = query.from(School.class); 
Join<School, Student> join = schoolRoot.join(School_.students); 
query.where(criteriaBuilder.equal(join.get(Student_.name), "john")); 

Он смотрит на студента с именем сортир во всех школах.

+0

Новое в jpa здесь. Как вы получили «School_.students». Я пытаюсь подобным образом, но не знаю, что это означает '_'. –

+0

@ Генерация метамодели VijayKalidindi в JPA, посмотрите на это. https://docs.jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html – BalaajiChander

0

Я думаю, что это сделало бы подобную вещь;

FROM School sch WHERE 'Student Name' = ANY (SELECT stud.name FROM sch.students stud) 
Смежные вопросы