Cuando hablamos de EJB (Enterprise JavaBeans) indudablemente tenemos que hablar sobre JPA.
Siempre me ha parecido algo rigido el hecho de tener que usar consultas JPQL para generar mis Entity Class, aunque estar este tipo de consultar resulta beneficioso a la hora de cambiar de base de datos completamente ya que para la base de datos es transparente el JPQL. y aporta mucho a a la portabilidad del código con respecto a la base de datos.
Pero en ocasiones necesitamos hacer uso de caracteristicas propias de la base datos para crear consultas mas complejas y nos vemos limitados por el JPQL entonces vemos la necesidad de utilizar consultas SQL nativas y a la vez son mucho más rapidas que las JPQL.
¿Como se utilizan?
Se podría decir que la sintaxis es la siguiente:
Query createNativeQuery(String sql, Class entityClass)
Donde:
Parametro uno: String sql
Es la consulta SQL nativa en el cual deben de ir los campos que conformaran nuestra Entity Class.
Parametro dos: Class entityClass
Es la Entity Class resultante de la consulta nativa SQL.
Ahora como siempre recalco, es tipico de este blog desarrollar un pequeño ejemplito de uso.
Asumiendo, ya tenemos generadas nuestra Entity Class llamada Persona procedremos a generar una lista de "personas".
EntityManagerFactory emf=Persistence.createEntityManagerFactory("nombreUnidadPersistencia");
EntityManager em=em.createEntityManager();
String consulta="select * from persona";
Query q=em.createNativeQuery(consulta,com.paquete.modelo.Persona.class);
Persona[] personas=(Persona[])q.getResultList().toArray(new Persona[0]);
for(Persona p:personas)
System.out.println(p.getPropiedad());
A veces no queremos tener un array de Entity Class sino que queremos obtener un valor escalar proveniente de una función sum, avg, max, etc...
EntityManagerFactory emf=Persistence.createEntityManagerFactory("nombreUnidadPersistencia");
EntityManager em=em.createEntityManager();
String consulta="select sum(campo) from tabla";
Query q=em.createNativeQuery(consulta);double total=((BigDecimal)((List)q.getSingleResult()).get(0)).doubleValue();De esta forma podemos trabajar con consultas SQL nativas y poder hacer uso de las capacidades de nuestra base de datos.