query nativas getsingleresult getresultlist example consultas java hibernate casting persistence

java - nativas - getresultlist query



Persistencia de Java: convertir a algo el resultado de Query.getResultList()? (5)

Hola a todos, soy nuevo en la persistencia / hibernación y necesito tu ayuda.

Aquí está la situación. Tengo una mesa que contiene algunas cosas. Llamémosles Personas. Me gustaría obtener todas las entradas de la base de datos que se encuentran en esa tabla.

Tengo una clase de persona que es un POJO simple con una propiedad para cada columna en la tabla (nombre, edad, ...)

Esto es lo que tengo:

Query lQuery = myEntityManager.createQuery("from Person") List<Person> personList = lQuery.getResultList();

Sin embargo, recibo una advertencia que dice que se trata de una conversión no verificada de List a List<Person>

Pensé que simplemente cambiando el código a

Query lQuery = myEntityManager.createQuery("from Person") List<Person> personList = (List<Person>)lQuery.getResultList();

funcionaría ... pero no lo hace.

Hay alguna forma de hacer esto ? ¿La persistencia me permite establecer el tipo de retorno de la consulta? (¿A través de genéricos tal vez?)


Bueno, existe la solución de la clase Java Collections, pero no explicaste cómo estaba fallando tu lanzamiento o si solo estaba dando una advertencia ...

Esta es una forma de validar esto:

Collections.checkList(lQuery.getResultList(), Person.class);

Pero si no necesitas validarlo:

@SuppressWarnings("unchecked") List<Person> personList = lQuery.getResultList();



He estado atrapado con este problema por un tiempo, también. Puede recorrer la lista y verificar, pero preferiría menos ruido. El camino más corto que he visto para solucionar esto es silenciar la advertencia, pero también me siento muy incómodo con eso. Me interesaría ver otras soluciones.

@SuppressWarnings("unchecked") List<Person> personList = lQuery.getResultList();

Hmm, mientras investigaba encontré una post interesante en java.net. He encontrado los comentarios de los usuarios particularmente interesantes.


Forma alternativa:

Query query = entityManager.createNativeQuery("SELECT * FROM person", Person.class); List<Person> rows = query.getResultList();


Nota: esta respuesta no está actualizada en JPA 2.0, lo que le permite especificar el tipo esperado. Ver esta respuesta

Suprimiendo la advertencia con

@SuppressWarnings("unchecked") List<MyType> result = (List<MyType>) query.getResultList();

Es la única solución a este problema que he visto. La supresión es fea, pero puede confiar en que JPA devolverá el tipo correcto de objeto, por lo que no es necesario verificarlo manualmente.

Si usa polimorfismos y no conoce el tipo de resultado exacto, el uso de Genéricos con un parámetro de Class acotada también es un patrón común:

public List<T extends MyBaseType> findMyType(Class<T> type) { @SuppressWarnings("unchecked") List<T> result = (List<T>) this.entityManager.createQuery( "FROM " + type.getName()) .getResultList(); return result; }