2009-10-16 10 views
16

¿Alguien puede decirme las razones intrínsecas por las que en el Administrador de Entidades JPA 1.0 cuando recupera un Objeto mediante búsqueda, tiene que tratar con nulo si no se encuentra, pero cuando usa la interfaz de Consulta mediante createQuery getResultList arroja una NoResultException cuando no se encuentra.¿Por qué en las consultas de JPA EntityManager arroja NoResultException pero no encuentra?

Tal vez me falta algo, pero creo que es muy incoherente para un lenguaje, y en realidad tuve que hacer un gran rediseño debido al cambio de un simple buscador a una consulta más detallada utilizando la interfaz de consulta.

Gracias chicos.

+0

Creo que tiene ese error. queryForObject() arroja una excepción. queryForList() devuelve una lista vacía. – cletus

+0

No entiendes algo. Estoy hablando de javax.persistence.EntityManager y javax.persistence.Query. Verifique esas interfaces que comprenderá. –

Respuesta

7

Al hacer un hallazgo, jpa utilizará la clave principal para localizar el objeto de entidad, a menudo utilizando la memoria caché de segundo nivel y, por lo general, es mucho más rápido que createQuery y getSingleResult.

O bien obtiene nulo o el objeto vuelve a buscar. Cuando hace una createQuery y se crea una instancia de objeto Query. Si haces una getResultList no arrojará una NoResultException, solo si haces un getSingleResult lanzará esa excepción. Si haces una getResultList y no se encuentra ninguna, entonces se devolverá null.

+4

Eso es correcto sí. Todavía no está muy claro para mí por qué las personas especialistas en JPA decidieron en un caso lanzar una noresultexception y en el otro simplemente devolver null, si su operación lógicamente es muy similar. Que se trata de una excepción no revisada no lo hace más fácil ... o dado la vuelta: ¿qué se oponía a la devolución de null de getSingleResult frente a lanzar una excepción? En mi punto de vista, eso sería más consistente: lanzar un NoREsultExcpetion en getSingleResult y encontrar o devolver null. pero no mezclarlo –

+0

getResultList() al menos w/Eclipselink (que es la implementación de referencia JPA2) devolverá una Lista vacía, no una NULL. – NBW

+1

Sí para JPA2, pero la pregunta en ese momento no era para JPA2, pero JPA –

-1

Creo que elimina este cheque nulo:

Object o = q.getSingleResult(); 
if (o != null) 
    return (MyObj) o; 
return o; 

Mediante la introducción de un RuntimeException (NoResultException), los programadores pueden lanzar con seguridad q.getSingleResult() para MyObj, y dejar la excepción a la persona que llama.

En cuanto a q.getResultList(), siempre devolverá una lista, null-check no es necesario.

Pero todavía siento que esto no es intuitivo.

+2

-1 No es necesario comprobar 'null' antes del lanzamiento, por lo que sería exactamente lo mismo que' return (MyObj) q.getSingleResult() ' –

+0

Didier tiene razón. Puedes lanzar nulo a cualquier tipo. – Spina

+0

lo siento, mi mal :( – smallufo

21

Las consultas se pueden utilizar para recuperar casi cualquier cosa, incluido el valor de una sola columna en una sola fila.

Si getSingleResult() devolviera nulo, no podría decir si la consulta no coincidía con ninguna fila o si la consulta coincidía con una fila pero la columna seleccionada contiene nulo como su valor.

Cuestiones relacionadas