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)
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)
你提到从查询中获取结果列表,因为你不知道有一个UniqueResult(因此例外)你可以使用list并检查大小?
if (query.list().size() == 1)
Run Code Online (Sandbox Code Playgroud)
由于您没有执行get()来获取唯一对象,因此无论您调用uniqueResult还是list,都将执行查询.