Saltar al contenido

Obtener nombres de columna de una consulta nativa JPA

Estate atento ya que en este escrito hallarás la respuesta que buscas.

Solución:

Este código funcionó para mí

Clase DTO:

 public class ItemResponse 

 private T item;

 public ItemResponse() 
 

 public ItemResponse(T item) 
   super();
   this.item = item;
 

 public T getItem() 
    return item;


public void setItem(T item) 
    this.item = item;



La clase de servicio está en la siguiente

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Service;
import org.hibernate.transform.AliasToEntityMapResultTransformer;

@Service
public class ServiceClass 

@PersistenceContext
public EntityManager entityManager;

public ItemResponse exceuteQueryResponse(String queryString) 

        ItemResponse itemResponse=new ItemResponse();           
        Query jpaQuery =  entityManager.createNativeQuery(queryString);
        org.hibernate.Query hibernateQuery =((org.hibernate.jpa.HibernateQuery)jpaQuery).getHibernateQuery();
      hibernateQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
        List> res = hibernateQuery.list();

        itemResponse.setItem(res);
        return itemResponse;

    

    

2020

Con hibernate 5.2.11.Final es bastante fácil. En mi ejemplo, puede ver cómo obtengo los nombres de columna para cada fila. Y cómo obtengo valores por nombre de columna.

Query q = em.createNativeQuery("SELECT columnA, columnB FROM table");
List result = q.getResultList();

for (Tuple row: result)

    // Get Column Names
    List> elements = row.getElements();
    for (TupleElement element : elements ) 
        System.out.println(element.getAlias());
    

    // Get Objects by Column Name
    Object columnA;
    Object columnB;
    try 
        columnA = row.get("columnA");
        columnB= row.get("columnB");
     catch (IllegalArgumentException e) 
        System.out.println("A column was not found");
    


La respuesta DTO de Ryiad agrega algo de confusión, deberías haberlo mantenido alejado. Deberías haber explicado que funciona solo con hibernate.

Si, como yo, necesita mantener el orden de las columnas, puede especificar su propio transformador. copié el código de hibernate y cambié HashMap a LinkedHashMap:

import java.util.LinkedHashMap;
import java.util.Map;

import org.hibernate.transform.AliasedTupleSubsetResultTransformer;
import org.hibernate.transform.ResultTransformer;

/**
 * @link ResultTransformer implementation which builds a map for each "row", made up of each aliased value where the
 * alias is the map key. Inspired by @link org.hibernate.transform.AliasToEntityMapResultTransformer, but kepping the
 * ordering of elements.
 * 

* Since this transformer is stateless, all instances would be considered equal. So for optimization purposes we limit * it to a single, singleton @link #INSTANCE instance. */ public class AliasToEntityMapResultTransformer extends AliasedTupleSubsetResultTransformer public static final AliasToEntityMapResultTransformer INSTANCE = new AliasToEntityMapResultTransformer(); /** * Disallow instantiation of AliasToEntityMapResultTransformer. */ private AliasToEntityMapResultTransformer() @Override public Object transformTuple(Object[] tuple, String[] aliases) Map result = new LinkedHashMap<>(tuple.length); for (int i = 0; i < tuple.length; i++) String alias = aliases[i]; if (alias != null) result.put(alias, tuple[i]); return result; @Override public boolean isTransformedValueATupleElement(String[] aliases, int tupleLength) return false; /** * Serialization hook for ensuring singleton uniqueing. * * @return The singleton instance : @link #INSTANCE */ private Object readResolve() return INSTANCE;

Con este transformador puedes usar la solución de Ryiad con Hibernate:

    Query jpaQuery =  entityManager.createNativeQuery(queryString);
    org.hibernate.Query hibernateQuery =((org.hibernate.jpa.HibernateQuery)jpaQuery).getHibernateQuery();
  hibernateQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
    List> res = hibernateQuery.list();

Aquí puedes ver las reseñas y valoraciones de los usuarios

Recuerda dar difusión a esta reseña si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología