我正在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()(如果存在值,则执行代码块)。
关于如何使用的一些提示Optional
用Optional<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传递,然后如果我试图保存(),那么它的工作正常。 我想