Ir al contenido principal

Manejo de consultas nativas en Java: Cómo convertir Object[] a una clase (Sin Hibernate)

¡Hola a todos los programadores! 👨‍💻👩‍💻 En nuestro día a día, a menudo nos encontramos con situaciones donde necesitamos hacer consultas directas a la base de datos que no están mapeadas a una clase o entidad. Aunque frameworks como Hibernate o JPA hacen este trabajo de forma automática, a veces nos topamos con código legacy, clases de servicio complejas o consultas muy específicas que nos obligan a trabajar con resultados "crudos".

Si te ha pasado que una consulta nativa te devuelve un listado de Object[] y te preguntas cómo transformarlo en una clase Java que puedas usar fácilmente, ¡has llegado al lugar correcto! En este artículo, te mostraremos una solución práctica y temporal para este problema.


El problema: NativeQuery y sus resultados

Cuando realizamos una consulta nativa usando entityManager.createNativeQuery(), el resultado por defecto es una lista de objetos genéricos (List<Object[]>), donde cada Object[] representa una fila de la tabla. El reto es tomar esos arreglos y pasarlos a una clase de modelo, como nuestra clase Comite.


Paso a paso: La solución

Para abordar este desafío, te proponemos una estrategia simple y organizada, dividida en tres partes:

1. El método que ejecuta la consulta

Este es el punto de partida. Aquí, creamos un método que se conecta a la base de datos, ejecuta la consulta nativa y recibe el resultado. Luego, este resultado es pasado a un método auxiliar que se encargará de la conversión.

Ejemplo de código:

public List<Comite> getAllComites() {
  // 1. Construir la consulta SQL nativa
  StringBuilder sql = new StringBuilder();
  sql.append("SELECT * FROM comiteInfo");
  
  // 2. Ejecutar la consulta y obtener el resultado
  Query query = this.entityManager.createNativeQuery(sql.toString());
  List<Object[]> resultList = query.getResultList();
  
  // 3. Convertir la lista de Object[] a una lista de Comite
  return convertObjectComite(resultList);
}

2. El método que convierte los objetos

Esta función es el corazón de la solución. Recibe la List<Object[]> del método anterior y se encarga de iterar sobre cada fila. En cada iteración, crea una nueva instancia de la clase Comite y le asigna los valores del arreglo de objetos.

Ejemplo de código:

private List<Comite> convertObjectComite(List<Object[]> resultQuery) {
  List<Comite> resultConvert = new ArrayList<>();
  
  // 1. Iterar sobre cada fila (Object[]) del resultado
  for (Object[] data : resultQuery) {
    // 2. Crear un nuevo objeto Comite con los datos de la fila
    Comite objComite = new Comite(data);
    
    // 3. Agregar el objeto a la lista de resultados
    resultConvert.add(objComite);
  }
  
  return resultConvert;
}

3. El constructor de la clase de modelo

Aquí es donde ocurre la magia final. El constructor de la clase Comite está diseñado para recibir un arreglo de Object (Object... fields). Dentro de este constructor, tomamos cada elemento del arreglo y lo casteamos al tipo de dato correcto para asignarlo al atributo correspondiente. Es crucial que el orden y tipo de los campos en el SELECT coincidan con el orden en el constructor.

Ejemplo de código:

public class Comite {
  private Long idComite;
  private String nombreComite;
  private String indTipComite;
  
  // Constructor para la conversión de Object[]
  public Comite(final Object... fields) {
    super();
    this.idComite = (Long) fields[0];
    this.nombreComite = (String) fields[1];
    this.indTipComite = (String) fields[2];
  }
  
  // Getters y Setters
  // ...
}

Consideraciones y llamado a la acción

Aunque este método es muy útil para solucionar problemas puntuales, es importante recordar que no es la forma más recomendada a largo plazo. La mejor práctica es utilizar las herramientas que ofrecen los frameworks como JPA e Hibernate para mapear las consultas a entidades, ya que esto proporciona un código más limpio, robusto y fácil de mantener. Esta solución es ideal como un "parche" temporal o en escenarios donde la refactorización completa no es viable.

¿Te ha sido útil esta técnica? ¡Déjanos un comentario y cuéntanos en qué situación la has utilizado! Y no olvides compartir este artículo con otros desarrolladores que puedan necesitar esta solución. ¡Hasta la próxima! 🚀

Comentarios

Entradas Populares

Renombrar una columna en Oracle: Guía rápida y sencilla 💻

¡Hola a todos! En el mundo de las bases de datos, es común necesitar hacer ajustes en la estructura de las tablas, y una de las tareas más frecuentes es renombrar una columna. Ya sea por un error tipográfico, una mejora en la nomenclatura o un cambio en los requisitos, saber cómo hacerlo de manera eficiente es fundamental. Afortunadamente, Oracle facilita esta tarea con una sintaxis simple y directa. A continuación, te muestro cómo puedes renombrar una columna de una tabla en un solo paso. La sintaxis para renombrar una columna Para cambiar el nombre de una columna, utilizamos la sentencia ALTER TABLE . Esta es la forma más segura y recomendada de modificar la estructura de una tabla sin afectar los datos existentes. ALTER TABLE <nombre_de_la_tabla> RENAME COLUMN <nombre_antiguo_del_campo> TO <nuevo_nombre_del_campo>; COMMIT; Análisis de la sintaxis: ALTER TABLE <nombre_de_la_tabla> : Esta parte de la sentencia le indica a Oracle que vas a modificar la estructur...

¿Tu PC no puede instalar la actualización KB5034441? No te preocupes, aquí tienes la solución y la explicación

Sabemos que iniciar el 2024 con problemas técnicos no es lo ideal. Si has intentado instalar la reciente actualización KB5034441 y te has encontrado con el frustrante error 0x80070643 , no estás solo. Este problema ha afectado a muchos usuarios y puede causar una gran confusión, especialmente cuando la descarga parece ir bien, pero la instalación se detiene en 0%. En este artículo, vamos a desglosar qué es lo que está causando este error, por qué no es tan grave como parece y qué pasos puedes seguir para manejarlo. Mensaje de Error Entendiendo el error 0x80070643 en la actualización KB5034441 La actualización KB5034441 está diseñada para reforzar la seguridad de tu entorno de recuperación de Windows (Windows Recovery Environment, WinRE), especialmente para aquellos que utilizan la función de cifrado de disco BitLocker. La intención es buena, pero la implementación ha revelado un problema para ciertos sistemas. El código de error 0x80070643 se traduce como ERROR_INSTALL_FAILURE , y e...