EJB: Usando consultas SQL nativas

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.

Comentarios (5)

5 Response to "EJB: Usando consultas SQL nativas"

  1. Ramiro Fuentes says:
    domingo, octubre 04, 2009

    Este blog es la verga en salsa. No dejes de postear.

    Salu2

  2. Anónimo Says:
    jueves, noviembre 19, 2009

    hola muy bueno tu blog... quisiera preguntarte algo.. estoy haciendo una consulta a una tabla de oracle de la siguiente forma

    String sqlQuery = "SELECT column_name AS Campo, data_type AS Tipo_datos, data_length AS tam, " +
    "nullable AS nulos, column_id AS ubicacion FROM all_tab_columns WHERE table_name = 'TTR_MARCAS_VEH'";

    Query consulta = em.createNativeQuery(sqlQuery);

    List configTabla= consulta.getResultList();

    en configTabla me queda el resultado pero no se como mirar el resultado del List.. En lo que me puedas ayudar Gracias

    Nota: la tabla all_tab_columns no la tengo como una entity en el ejb

  3. Anónimo Says:
    jueves, diciembre 03, 2009

    Que tal,

    Muy bueno tu blog, en estos dias estare leyendo algunas entradas pero por favor trata de cambiar el fondo porque cuesta mucho trabajo leer con la letra negra.

    Estare pendiente de nuevas entradas.

    Saludos.

  4. Arabic directory says:
    domingo, febrero 21, 2010

    thank you very much

  5. new websites says:
    lunes, mayo 10, 2010

    Thank you very much