web-dev-qa-db-fra.com

javax.persistence.NoResultException: aucune entité trouvée pour la requête

Avant de poster cette question, j'avais déjà cherché this , mais je n'ai pas pu obtenir ce que je cherchais.

Je sais que pour la requête que j'ai écrite, il ne peut exister qu'une seule ligne ou pas du tout. Donc, il n'y a aucune raison pour moi d'utiliser getResultList().

Voici mon code:

String hql="from DrawUnusedBalance where unusedBalanceDate= :today";
Query query=em.createQuery(hql);
query.setParameter("today",new LocalDate());

DrawUnusedBalance drawUnusedBalance= 
    (DrawUnusedBalance)query.getSingleResult();// we can have only a
                                               // single datum per day
//`System.out.println(drawUnusedBalance.toString());`

Le problème est que s'il n'y a pas de ligne, il lève une exception et sinon cela fonctionne bien. Je connais le problème mais je cherche aussi la meilleure solution.

Ce que je voulais, c'est que s'il n'y a pas de ligne dans la base de données, je voulais obtenir un objet nul (au lieu d'obtenir une exception), donc j'insérerai de nouvelles données, si ce n'est pas nul, je veux juste le mettre à jour.

Il y a une façon de gérer cela, qui, je crois, n'est pas la bonne façon de le faire. C'est: j'aurai un bloc try-catch et s'il déclenche une exception, je peux écrire pour insérer de nouvelles données dans la base de données sur le bloc catch. Mais je crois qu'il y aura une meilleure façon.

44
WowBow

Oui. Vous devez utiliser le try/catch bloc, mais pas besoin d'attraper le Exception. Selon API il lancera NoResultException s'il n'y a pas de résultat, et c'est à vous de décider comment vous voulez le gérer.

DrawUnusedBalance drawUnusedBalance = null;
try{
drawUnusedBalance = (DrawUnusedBalance)query.getSingleResult()
catch (NoResultException nre){
//Ignore this because as per your logic this is ok!
}

if(drawUnusedBalance == null){
 //Do your logic..
}
79
ManuPK

Lorsque vous utilisez Java 8, vous pouvez profiter de l'API de flux et simplifier le code pour

return (YourEntityClass) entityManager.createQuery()
....
.getResultList()
.stream().findFirst();

Cela vous donnera Java.util.Optional

Si vous préférez null à la place, tout ce dont vous avez besoin est

 ...
.getResultList()
.stream().findFirst().orElse(null);
16
Bartosz Bilicki

Vous avez mentionné l'obtention de la liste des résultats à partir de la requête, car vous ne savez pas qu'il existe un résultat unique (d'où l'exception) que vous pouvez utiliser la liste et vérifier la taille?

if (query.list().size() == 1) 

Comme vous ne faites pas de get () pour obtenir votre objet unique, une requête sera exécutée, que vous appeliez uniqueResult ou list.

7
Alex Barnes

Si vous ne savez pas s'il y a des résultats, utilisez getResultList().

List<User> foundUsers = (List<User>) query.getResultList();
        if (foundUsers == null || foundUsers.isEmpty()) {
            return false;
        }
User foundUser = foundUsers.get(0);
3
ACV