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

Wow*_*Bow 49 java null hibernate jpa exception-handling

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

我知道,对于我写的查询,可能只存在一行或根本没有.所以,没有理由让我使用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());`
Run Code Online (Sandbox Code Playgroud)

问题是,如果没有行,它会抛出异常,如果没有,它就可以正常工作.我知道这个问题,但我也在寻找最好的解决方案.

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

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

Man*_*uPK 84

是.你需要使用try/catch块,但不需要捕获Exception.根据API,NoResultException如果没有结果,它将抛出,并由您决定如何处理它.

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..
}
Run Code Online (Sandbox Code Playgroud)

  • 我觉得捕获 **checked 异常** 并采取替代路径没有错。这就是 JPA 为您提供有关如何处理它的选项的原因。实际上,您正在寻找的方法在 [hibernate](http://docs.jboss.org/hibernate/core/3.2/api/org/hibernate/Query.html#uniqueResult()) 中可用,而 JPA 不可用. (2认同)

Bar*_*cki 18

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

return (YourEntityClass) entityManager.createQuery()
....
.getResultList()
.stream().findFirst();
Run Code Online (Sandbox Code Playgroud)

那会给你java.util.Optional

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

 ...
.getResultList()
.stream().findFirst().orElse(null);
Run Code Online (Sandbox Code Playgroud)

  • 该问题与“getSingleResult()”相关,而不是与“.getResultList()”相关。甚至在描述中也有说明。 (2认同)

Ale*_*nes 7

你提到从查询中获取结果列表,因为你不知道有一个UniqueResult(因此例外)你可以使用list并检查大小?

if (query.list().size() == 1) 
Run Code Online (Sandbox Code Playgroud)

由于您没有执行get()来获取唯一对象,因此无论您调用uniqueResult还是list,都将执行查询.