Consultas SQL nativas en JPA Java (Java Persistence API)

Java

Cuando desarrollamos Software con Java haciendo uso de JPA pensamos en que nos olvidaremos de las consultas SQL que normalmente hacemos para obtener información de una base de datos, sin embargo puede darse la necesidad de recurrir a usar consultas SQL nativas en JPA, para ello en este artículo de forma fácil y rápida te explicare como hacerlo.

Como usar consultas SQL nativas en JPA Java (Java Persistence API)

Debemos tener en cuenta que nuestro proyecto debe estar configurado para trabajar con JPA y correctamente conectado a una base de datos MySQL, si no es así puedes pasar por el siguiente artículo donde podrás ver la explicación paso a paso:

CRUD JAVA MYSQL JPA (Java Persistence Api)

¿Como empezamos a utilizar las consultas SQL nativas en JPA?

Eres libre de organizar tu proyecto, sin embargo recomiendo crear una clase en la cual colocarás todas tus consultas, para que estas estén disponibles en todo tu proyecto, coloquemos de nombre a la clase Nativas.java.

Llenando un JTable en Java mediante una consulta SQL nativa en JPA

public Query getClientes(){
 EntityManagerFactory emf = Persistence.createEntityManagerFactory("Unidad_Persistencia");
 EntityManager em=emf.createEntityManager();
 String Consulta = "SELECT identificacion, nombres, apellidos, direccion, telefono FROM clientes";
 Query q=em.createNativeQuery(Consulta);
 return q;
 }

La consulta anterior nos permite a través de una consulta SQL nativa en JPA extraer todos los clientes de nuestra tabla, si nos damos cuenta retornamos un objeto de tipo Query, Veamos como obtenemos los datos.

 private void Cargar_Clientes(){
 try {
 Query q = Nativas.getClientes();
 List r = q.getResultList();
 Object O[]=null;
 for (int i = 0; i < r.size(); i++) {
 Object obj = r.get(i);
 Object[] objectArray = (Object[]) obj;
 Modelo1.addRow(O);
 Modelo1.setValueAt(objectArray[0], i, 0);
 Modelo1.setValueAt(objectArray[1], i, 1);
 Modelo1.setValueAt(objectArray[2], i, 2);
 Modelo1.setValueAt(objectArray[3], i, 3);
 Modelo1.setValueAt(objectArray[4], i, 4);
 }
 } catch (Exception e) {
 JOptionPane.showMessageDialog(null, "Error Cargando clientes - "+e.getMessage());
 }
 }

En el código anterior obtenemos los datos de la consulta realizada y los almacenamos en una Lista, luego podemos iterar dicha lista para llenar una tabla, cada valor puede ser accedido mediante el índice en cada iteración del for, ejemplo en la primera iteración tenemos en objectArray el primer registro o entidad, al pasar el índice del primer resultado objectArray[0], podemos obtener la identificación, la parte que dice: Modelo1.setValueAt(objectArray[0], i, 0)… es por que estamos llenando un JTable, sin embargo solo es para efectos del ejemplo, puedes asignar tus datos al componente que desees.

Contando registros mediante una consulta SQL nativa en JPA

public Query Count(int id, String var){
 EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persis"); 
 EntityManager em = emf.createEntityManager();
 String Consulta = "SELECT COUNT(`id`) AS l FROM `tabla` WHERE `id`='"+id+"' AND `campo2`='"+var+"'";
 Query q = em.createNativeQuery(Consulta); 
 return q;
 }

También podemos pasar parámetros a la consulta para el ejemplo del anterior count, pasamos dos valores para incluirlos en la consulta nativa, Count(int id, String var).. los datos los obtenemos de la misma forma que en la consulta anterior con Select, esto es válido para todos los tipos de consulta, update, delete, insert, etc.