2012-02-25 26 views
5

Tengo dos entidades con una relación OneToMany. Para hacerlo simple, supongámoslos como Escuela y Estudiantes, con una relación unidireccional entre la escuela y los estudiantes. Quiero encontrar el objeto escolar que tiene un alumno específico (un estudiante con una edad, un nombre, un ssn, ...) específicos. sé que puedo crear un criterio simples como los siguientes para las propiedades de la escuela sencillo (para el nombre de la escuela, como el siguiente):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 + "%"); 

pero, ¿cómo puedo consulto a los estudiantes con un valor de propiedad específico, mientras que los estudiantes es representado como java.util.List en lugar de ser una propiedad básica?

¿Alguien puede ayudarme a resolver esto? Espero haber podido explicar mi problema.

Gracias

Respuesta

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")); 

Se parece a un estudiante con el nombre de Juan en todas las escuelas.

+0

Nuevo en jpa aquí. Cómo obtuviste el 'School_.students'. Estoy intentando algo similar, pero no sé lo que significa '_'. –

+0

@VijayKalidindi generación de metamodelos en JPA, échale un vistazo a esto. https://docs.jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html – BalaajiChander

0

Supongo que haría algo similar;

FROM School sch WHERE 'Student Name' = ANY (SELECT stud.name FROM sch.students stud) 
Cuestiones relacionadas