2010-04-10 20 views
9

he creado una consulta con ejb para comprobar si se utiliza el nombre de usuario. Cuando el singleResult es nulo, entonces me sale el siguiente excepción:javax.persistence.NoResultException: getSingleResult() no ha recuperado ninguna entidad

javax.persistence.NoResultException: getSingleResult() did not retrieve any entities 

Pero esta excepción es el resultado que quiero cuando el nombre de usuario es libre.

Aquí está el código:

public User getUserByUsername(String username) throws DAOException{ 
    try{ 
     Query q = em.createNamedQuery(User.getUserByUsername); 
     q.setParameter("username", username); 
     return (User) q.getSingleResult(); 
    }catch(Exception e){ 
     throwException(username, e); 
     return null; 
    } 
} 

¿Alguien sabe cuál es el problema. :(

me gustaría volver nula y don `t obtener una excepción.

Muchas gracias

+0

¿muestra la consulta con nombre? – Bozho

Respuesta

27

Usted parece volver a lanzar la excepción en su bloque catch con la declaración throwException(username, e);. Si esperas para obtener el usuario o null sin excepción alguna esto debería ser similar al siguiente:?

public User getUserByUsernameOrNull(String username) { 
    try{ 
     Query q = em.createNamedQuery(User.getUserByUsername); 
     q.setParameter("username", username); 
     return (User) q.getSingleResult(); 
    } catch(NoResultException e) { 
     return null; 
    } 
} 
+1

perfecto. Muchas gracias. –

0

lo que hace el método throwException hacer

¿Se está lanzando una excepción pero está utilizando el mensaje de la excepción anterior?

8

Use getResultList y compruebe si el List está vacío (tiene elemento de cero). De lo contrario, la lista contiene un elemento y simplemente lo devuelve.

+0

Esta debería ser la respuesta preferida, ya que evita el bloque de manejo de excepciones, que en este caso, JPA parece haber impuesto al cliente. http://blog.takipi.com/ignore-checked-exceptions-all-the-cool-devs-are-doing-it-based-on-600000-java-projects/ – michaelok

+0

Clase Iterables de guayaba, específicamente el método getFirst, muestra cómo se puede evitar la excepción para un caso no excepcional: getFirst 'Devuelve el primer elemento en iterable o defaultValue si el iterable está vacío. – michaelok

2

Experimenta el comportamiento definido al llamar al getSingleResult y no se encontró ninguna entrada: se arroja un NoResultException. Puede capturar NoResultException en catch-clause, porque la transacción no se marcará como rollback, cuando JPA está lanzando NoResultException. O puede usar getResultList() y verificar si el tamaño es exactamente "1", para que sepa que ha encontrado a su usuario.

Además, no devolvería "[nulo]" si no se encuentra el usuario, pero arroje una UserNotFoundException marcada (por definir). Pero esto depende del contrato del método que va a implementar.

+0

¿Puede profundizar en: "porque es la excepción de captura" la excepción de captura "no se ajusta" ... ¿Por qué no? –

2

Michael dijo: "Puede atrapar NoResultException en catch-clause, porque la transacción no se marcará como rollback, cuando JPA está lanzando NoResultException". Parece que para algunas implementaciones jpa, la transacción NoResultException rollbak, que viola la especificación jpa, de acuerdo con este artículo: NoResultException marks transaction rollback

+1

Tienes razón, esto sucede en Glassfish 4.0 – Roland

0

Si la aplicación utiliza Spring Roo la respuesta más votada no funciona: la excepción es capturado por los aspectos y que nunca se produce la deseada NoResultException. La única forma de resolver el problema es usar getResultList y verificar cero, uno o más resultados en el resultante List, como se indica en la segunda respuesta más votada.

Cuestiones relacionadas