异常: 未找到查询实体

在我发布这个问题之前,我已经看了 这个,但是我不能得到我想要的。

我知道对于我编写的查询,可能只存在一行,或者根本不存在。因此,我没有理由使用 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());`

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

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

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

148976 次浏览

是的。您需要使用 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..
}

您提到从 Query 获取结果列表,因为您不知道有一个 UniqueResult (因此是异常) ,您可以使用 list 并检查大小?

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

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

当您不知道是否有任何结果时,使用 getResultList()

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

在使用 java8时,您可以利用流 API 并将代码简化为

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

它会给你 java.util 可选项

如果您更喜欢使用 null,那么您所需要的就是

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

另一个选项是使用 uniqueResultOptions ()方法,该方法为您提供可选的 result:

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


Optional<DrawUnusedBalance> drawUnusedBalance=query.uniqueResultOptional();
String hql="from DrawUnusedBalance where unusedBalanceDate= :today";
DrawUnusedBalance drawUnusedBalance = em.unwrap(Session.class)
.createQuery(hql, DrawUnusedBalance.class)
.setParameter("today",new LocalDate())
.uniqueResultOptional()
.orElseThrow(NotFoundException::new);