javax.persistence.NoResultException:找不到用于查询的实体

2022-08-31 13:26:26

在我发布这个问题之前,我已经看过,但我无法获得我想要的东西。

我知道对于我写的查询,可能只存在一行或根本没有。因此,我没有理由使用.getResultList()

这是我的代码:

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());`

问题是,如果没有行,它会引发异常,如果没有,它就可以正常工作。我知道问题所在,但我也在寻找最佳解决方案。

我想要的是,如果数据库中没有行,我想获取一个空对象(而不是获得异常),所以我将插入一个新数据,如果它不是空的,我只想更新它。

有一种方法可以解决这个问题,我认为这不是正确的方法。它是:我将有一个 try-catch 块,如果它引发异常,我可以写入将新数据插入到 catch 块上的数据库中。但我相信会有更好的方法。


答案 1

是的。您需要使用该块,但无需捕获 .根据API,如果没有结果,它将抛出NoResultException,这取决于你想要如何处理它。try/catchException

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..
}

答案 2

使用java 8时,您可以利用流API并简化代码

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

这将给你java.util.Optional

如果您更喜欢空值,那么您只需要

 ...
.getResultList()
.stream().findFirst().orElse(null);