Читать книгу Desarrollo de aplicaciones web con Jakarta EE - César Francisco Castillo - Страница 42
2.9.4 Sentencias joins
ОглавлениеLa sentencia join permite enlazar objetos (registros) entre distintas entidades (tablas) mediante atributos (claves foráneas). Podemos especificar tres tipos de joins en función de nuestras necesidades, son los siguientes:
* JoinType.INNER
* JoinType.LEFT
* JoinType.RIGHT
El hecho de utilizar un join en una consulta no significa que esta recuperará los objetos relacionados. Para ello se debería usar fetch. Lamentablemente, fetch no es objeto de estudio de este libro, por lo que, si el lector desea aprender sobre ello, deberá acceder a la Wiki de EclipseLink que dejaré al final del capítulo.
Para comprender un poco más los vínculos entre clases, observe el siguiente diagrama UML:
Figura 2.10 Diagrama UML.
La entidad Carrera se vincula con la entidad Facultad mediante el atributo idfacultad, el cual nos indica que las carreras pertenecen a una facultad en particular. Podemos aprovechar esta relación y crear una consulta que retorne un listado con todas las carreras de una determinada facultad.
Para ello comenzaremos creando el objeto builder y el de criterios de la siguiente manera:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
Una vez creados ambos objetos, debemos especificar cuál será el origen de la consulta, es decir, desde qué clase o entidad obtendremos los objetos. Para ello definiremos la raíz como se muestra en el siguiente fragmento de código:
Root<Carrera> raizCarrera = criteriaQuery.from(Carrera.class);
Con nuestra raíz definida en la entidad Carrera ya podemos especificar cuál es el atributo mediante el cual se vinculará con la entidad Facultad. En este caso, es el atributo idFacultad. Observe que se omite la especificación del tipo de join, ya que, por defecto, es de tipo INNER, y es con el que trabajaremos.
Si hubiésemos necesitado obtener las carreras que no tienen un id de facultad asociado, hubiéramos empleado un JoinType.LEFT y, si hubiéramos querido lo contrario, hubiéramos empleado un JoinType.RIGHT
Join<Carrera, Facultad> join = raizCarrera.join(“idFacultad”);
Ahora debemos especificar en la cláusula where cuál será el atributo que utilizaremos como condición. En este caso utilizaremos el atributo idfacultad, cuyo tipo de dato es Integer, y lo compararemos con un código que recibiremos en una variable llamada codigoFacultad.
criteriaQuery.where(criteriaBuilder.equal(join.get(“idFacultad”), codigoFacultad));
Por último, solo nos falta crear la consulta y retornar el listado.
TypedQuery<Carrera> query = em.createQuery(criteriaQuery); return query.getResultList();