当前位置: 首页 > 面试题库 >

Spring Data JPA的findOne()更改为Optional怎么使用?

司徒元明
2023-03-14
问题内容

我正在SpringBoot2.0与一起学习Java8

然后,我遵循了一些博客制作教程示例。

教程源代码为:

@GetMapping("/{id}/edit")
public String edit(@PathVariable Long id, Model model) {
  model.addAttribute("categoryDto", categoryService.findOne(id));
  return "category/edit";
}

但是这段代码抛出了这个错误:

categoryService.findOne(id)

我正在考虑将JPA findOne()方法更改为Optional< S >

怎么解决呢?

更多信息:

这是categoryService方法:

public Category findOne(Long id) {
  return categoryRepository.findOne(id);
}

问题答案:

至少从2.0版本(已Spring-Data-Jpa修改)开始findOne()
现在,findOne()没有相同的签名和相同的行为。
以前,它在CrudRepository接口中定义为:

T findOne(ID primaryKey);

现在,findOne()您将找到的唯一方法CrudRepository是在QueryByExampleExecutor接口中定义为:

<S extends T> Optional<S> findOne(Example<S> example);

最终由接口SimpleJpaRepository的默认实现实现CrudRepository
此方法是通过示例搜索查询的,您不想将其替换。

实际上,具有相同行为的方法仍在新API中存在,但是方法名称已更改。
它是从更名findOne()findById()CrudRepository接口:

Optional<T> findById(ID id);

现在它返回一个Optional。可以预防的还不错NullPointerException

因此,现在要调用的实际方法是Optional<T> findById(ID id)

如何使用?
学习Optional用法。以下是有关其规格的重要信息:

可以包含或不包含非null值的容器对象。如果存在值,则isPresent()将返回true,而get()将返回该值。

提供了其他取决于所包含值是否存在的方法,例如orElse()(如果不存在值,则返回默认值)和ifPresent()(如果存在值,则执行代码块)。

关于如何使用的一些提示OptionalOptional<T> findById(ID id)

通常,当您通过ID查找实体时,您想返回它或进行特定处理(如果未检索到该实体)。

这里是三个经典用法示例。

1)假设如果找到该实体,则要获取它,否则要获取默认值。

你可以这样写:

Foo foo = repository.findById(id)
                    .orElse(new Foo());

或在合理的null情况下获取默认值(与更改API之前的行为相同):

Foo foo = repository.findById(id)
                    .orElse(null);

2)假设如果找到该实体,您想返回它,否则您想抛出一个异常。

你可以这样写:

return repository.findById(id)
        .orElseThrow(() -> new EntityNotFoundException(id));

3)假设您要根据是否找到实体来应用不同的处理(无需引发异常)。

你可以这样写:

Optional<Foo> fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()){
    Foo foo = fooOptional.get();
   // processing with foo ...
}
else{
   // alternative processing....
}


 类似资料:
  • SpringDataJpa中 Specification怎样使用in查询 实体类Menu.java如下 想通过roles属性做in查询,代码如下 错误如下: Parameter value [com.appmtce.pojo.entity.role.Role@20f81e2a] did not match expected type [java.util.Collection (n/a)] 我的S

  • 问题内容: 我已经在许多网站上阅读了Optional应该仅用作返回类型,而不能在方法参数中使用。我正在努力寻找一个合理的理由。例如,我有一段逻辑,其中包含2个可选参数。因此,我认为这样写我的方法签名(解决方案1)会很有意义: 许多指定为的网页不应用作方法参数。考虑到这一点,我可以使用以下方法签名并添加清晰的注释以指定参数可以为null,希望将来的维护者将读取,因此始终在使用参数之前进行检查(解决方

  • 我只想不使用xml,所以我需要非xml替代这些设置。这是我的POM。

  • 我需要在我的mysql数据库中的表中更改列,以便列中当前为true的值更改为false,之前为false的值更改为true。 那么,在:值A:假值B:真之前 之后:值A:真值B:假 我该怎么做?试图为此编写一个液化迁移。我首先想到的是: 更新表设置列A=false,其中列A=true,设置列A=true,其中列A=false; 但我意识到,如果我首先将真值更改为假,那么所有值都将为假,然后MySQ

  • 我将typeorm与MongoDB一起使用。当我使用以下语法按Id搜索文档时我得到了未定义的结果,当我使用我得到了第一个语法中需要的userId的结果。 此外,相同的语法适用于ID以外的任何其他标准。 模型中Id的声明为: 目前,数据库中只有一个用户具有我搜索的userId。 问题可能出在哪里?如何解决这个问题?

  • 如何使用Spring Rest Controller和Spring Data JPA仅更新从@刚体传递的实体属性? 员工实体: 服务类方法: 请求体: Hibernate更新查询: Spring Data JPA正在尝试将company_id设置为空以进行更新,即使我没有将其传递给请求体?但是如果我从数据库中得到实体,使用employee_id传递,然后如果我试图保存(),那么它的工作正常。 我想