Hibernate查询输出不存在的行

时间:2015-09-03 10:00:39

标签: hibernate hibernate-mapping hibernate-annotations

我有一个Hibernate查询:

StringBuilder sb = new StringBuilder("" +
                "SELECT d.value " +
                "FROM Table d " +
                "WHERE d.date = :date ");

        Query q = em.createQuery(sb.toString())
                .setParameter("date",date);

        BigDecimal result = (BigDecimal) q.getSingleResult();

        if (result == null)
            result = BigDecimal.ZERO;

        return result;

当我通过Table中存在的日期时,它运行良好,但是当我传递不存在的日期时,它会返回异常 javax.persistence.NoResultException: No entity found for query

我试图在@NotFound(action = NotFoundAction.IGNORE)的每个字段下添加Table注释,但异常是相同的。我该如何处理这个问题?

2 个答案:

答案 0 :(得分:3)

单个结果在没有结果时抛出异常,你可以捕获该异常然后返回null,q.getResultList(),然后检查列表,这样你就可以看到是否有重复,单个结果抛出另一个异常的情况。

来自javadoc的

Throws:
    NoResultException - if there is no result
    NonUniqueResultException - if more than one result

处理异常将如下:

 Query q = em.createQuery(sb.toString())
            .setParameter("date",date);
  try {
     BigDecimal result = (BigDecimal) q.getSingleResult();
     return result;
  } catch (NoResultException e){
     return BigDecimal.ZERO;
  }
}

答案 1 :(得分:1)

我认为您的查询没有任何问题。这是Query.getSingleResult()方法的行为。由于Radu Toader建议您可以使用Query.getResultList()或其他方法来处理它,所以将它包装在try catch块中。

BigDecimal result = null;
try{
   result = (BigDecimal) q.getSingleResult();
} catch(NoResultException e) {
   //log exception or throw it...
}
return result;