至少从2.0版本,Spring-Data-Jpa修改findOne()。
现在,findOne() 既没有相同的签名也没有相同的行为。
之前在CrudRepository接口中定义为:
T findOne(ID primaryKey);
现在,您将在 CrudRepository 中找到的单个 findOne() 方法在 QueryByExampleExecutor 接口中定义为:
<S extends T> Optional<S> findOne(Example<S> example);
最终由SimpleJpaRepository 实现,CrudRepository 接口的默认实现。
此方法是通过示例搜索进行查询,您不希望将其作为替代方法。
其实在新的API中还是有同样行为的方法,只是方法名变了。
在CrudRepository接口中,它从findOne()重命名为findById():
Optional<T> findById(ID id);
现在它返回一个Optional,这对于阻止NullPointerException 来说还不错。
所以,现在实际调用的方法是Optional<T> findById(ID id)。
如何使用它?
学习Optional 用法。
以下是有关其规范的重要信息:
一个容器对象,它可能包含也可能不包含非空值。如果一个
值存在,isPresent() 将返回 true,get() 将返回
价值。
其他方法取决于是否存在
提供了包含的值,例如 orElse() (返回默认值
如果值不存在)和 ifPresent()(如果
值存在)。
关于如何使用Optional 和Optional<T> findById(ID id) 的一些提示。
通常,当您通过 id 查找实体时,您希望将其返回或在未检索到时进行特定处理。
以下是三个经典用法示例。
- 假设如果找到实体,您想要获取它,否则您想要获取默认值。
你可以写:
Foo foo = repository.findById(id)
.orElse(new Foo());
或在有意义的情况下获取 null 默认值(与 API 更改之前的行为相同):
Foo foo = repository.findById(id)
.orElse(null);
- 假设如果实体被发现你想返回它,否则你想抛出一个异常。
你可以写:
return repository.findById(id)
.orElseThrow(() -> new EntityNotFoundException(id));
- 假设您想根据是否找到实体应用不同的处理(不一定抛出异常)。
你可以写:
Optional<Foo> fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()) {
Foo foo = fooOptional.get();
// processing with foo ...
} else {
// alternative processing....
}