当前位置: 首页 > 知识库问答 >
问题:

在Hibernate Panache中抛出带有空结果集的异常

陆野
2023-03-14

我在Quarkus REST应用程序中有几个接受ID的GET调用。

/rest/v1/employee/{id}/id

我使用活动记录模式来处理数据库请求。来自Spring的JdbcTemplate将在结果集为空时抛出异常。我将使用ControllerAdvice捕获此异常,并抛出相应的响应代码(在本例中为404)。这也适用于所有其他例外情况。

有没有办法将Panache/Hibernate配置为在空结果集上抛出异常?现在,我必须手动检查结果是否为空/空,然后抛出相应的异常。

例如,这就是我现在要做的:

@GET
@Path("/employee/{id}/id")
public Employee getEmployeeById(@PathParam("id") Integer id) {
    Employee employee = Employee.findById(id);

    if (employee == null) {
        throw new EmptyResultDataAccessException("No results found");
    }

    return Employee.findById(id);
}

当我希望在异常处理程序中捕获异常并简单地返回对findById(…)的调用时

@GET
@Path("/employee/{id}/id")
public Employee getEmployeeById(@PathParam("id") Integer id) {
    return Employee.findById(id);
}


共有1个答案

印晋
2023-03-14

findById将使用EntityManager。find()幕后,如果找不到实体,则返回null。您可以使用findByIdOptional并像这样使用它:

@GET
@Path("/employee/{id}/id")
public Employee getEmployeeById(@PathParam("id") Integer id) {
    return Employee.findByIdOptional(id).orElseThrow(EmptyResultDataAccessException::new);
}
 类似资料:
  • 我很好奇是否可以在以下情况下使用orElseThrow(),或者是否有更Java的8种方法可以将其等效为1行?

  • 我使用Compass对内存数据结构中的数据进行查询。它适用于搜索字符串和枚举值,现在我想搜索日期。 问题:运行此查询时不会返回结果。我得到一个空名单。查询中的日期与Date对象中的日期相同。 怎么啦??用指南针搜索s的方法是错误的吗?我只能找到关于日期的范围查询,但无法找到具有确切日期或部分确切日期的搜索。

  • 问题内容: 我希望将空结果集的总计设置为0。我尝试了以下方法: 结果: 子问题:上面的工作在Oracle中行不通吗? 问题答案: 在有关聚合函数的文档页面中: 应该注意的是,除了这些函数, 当没有选择任何行时 ,这些函数将 返回空值 。特别是,没有行返回空值,而不是预期的零值。必要时,该函数可用于将零替换为null。 所以,如果你想保证返回的值,适用于 结果 的,而不是它的参数: 至于Oracle

  • 与Spring Reactor类似:当publisher发出值时,如何引发异常? 我在DAO中有一个finder方法,它返回结果SomePojo。finder调用amazon db API和具有调用的输出。所以我在我的服务层createSomePojo方法中尝试这个hasElement()检查。(不确定我是否正确使用了它-我正在尝试和调试) 基本上:我想检查是否已经存在元素,保存是非法的,我不会调

  • 问题内容: 我正在android中做一个应用程序,因此我需要访问com.android.internal.telephony API。现在,我可以访问这些API了,但问题是,无论我在自己的类中调用Class Call.java方法的什么地方,都会抛出。您可以在http://hi- android.info/src/com/android/internal/telephony/Call.java.h

  • 我试图用spring配置bitronix,但我在启动Tomcat时遇到了异常。 任何帮助都很感激。 原因:org.hibernate.engine.JNDI.jndiException:无法在org.hibernate.engine.JNDI.internal.jndiserviceimpl.locate(jndiserviceimpl.java:117)在org.hibernate.engine