2009-06-05 11 views
24

Hola a todos, soy nuevo en persistencia/hibernación y necesito su ayuda.Persistencia de Java: ¿Transmitir a algo el resultado de Query.getResultList()?

Aquí está la situación. Tengo una mesa que contiene algunas cosas. Vamos a llamarlos personas. Me gustaría obtener todas las entradas de la base de datos que están en esa tabla.

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

Esto es lo que tengo:

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

Sin embargo, recibirá una advertencia diciendo que esto es una conversión sin control desde List a List<Person>

pensé que simplemente cambiando el código para

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

funcionaría ... pero no es así.

¿Hay alguna manera de hacerlo? ¿La persistencia me permite establecer el tipo de devolución de la consulta? (A través de genéricos tal vez?)

Respuesta

59

Como recién llegado a la APP estaba tomando esto como el respuesta definitiva, pero luego me encontré con uno mejor a través de esta pregunta: Why in JPA EntityManager queries throw NoResultException but find does not?

Es tan simple como que el uso de TypedQuery lugar de consulta de ejemplo:

TypedQuery<Person> lQuery = myEntityManager.createQuery("from Person", Person.class); 
List<Person> personList = lQuery.getResultList(); 
+0

Usted señor, me dio la mejor respuesta. Gracias. ++++ 1 –

1

He estado atascado con este problema por un tiempo, también. Puede repetir la lista y verificar, pero prefiero menos ruido. La manera más rápida que he visto de evitar esto es silenciar la advertencia, pero también estoy muy incómodo con eso. Me interesaría ver otras soluciones.

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

Hmm, mientras que la investigación me encontré con una interesante post en java.net. Encontré los comentarios de los usuarios particularmente interesantes.

2

bien no es la solución de clase de colecciones de Java, pero no explicó cómo su fundición estaba fallando, o si fue sólo dar una advertencia ...

Ésta es una manera de validar esto:

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

Pero si no es necesario validarlo:

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

que no explicaba cómo mi colada estaba fallando porque no está fallando. Simplemente no silencia la Advertencia ... por lo que no hace nada. – GuiSim

9

Nota: Esta respuesta es obsoleta como de JPA 2.0, que le permite especificar el típico esperado mi. Ver this answer.


Suprimir la advertencia con

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

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

Si utiliza polimorfismos y no sabe el tipo de resultado exacto, el uso de medicamentos genéricos con un parámetro Class delimitada 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; 
} 
1

manera alternativa:

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