5.6.2.3. SQL nativo#
La última opción para realizar consultas avanzadas es, directamente usar sentencias SQL, pero tiene el problema de su dependencia del SGBD, por lo que sólo debería usarse como método complementario a JPQL o Criteria API cuando no es posible usar alguno de estos últimos medios porque la consulta es demasiado compleja y no las pueden expresar o están involucradas vistas o funciones almacenadas.
Sabiendo SQL (y las particularidades del SGBD) son sencillas de realizar:
Query query = em.createNativeQuery(
"SELECT id, nombre FROM Estudiante WHERE nombre LIKE :patron"
).setParameter("patron", "J%");
List<Object[]> resultado = query.getResultList();
Nota
En este caso, como usamos SQL directamente, los nombres que aparecen en la sentencia son nombres de tablas y columnas.
En caso, de que el resultado coincida con un objeto, podemos indicar que se construya el objeto:
TypedQuery<Estudiante> query = sesion.createNativeQuery(
"SELECT * FROM Estudiante WHERE nombre LIKE :patron",
Estudiante.class
).setParameter("patron", "J%");