从至少
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<T> findById(ID id)
的提示。
通常,当您按id查找实体时,您希望返回它或者在未检索到时进行特定处理。
以下是三个经典的用法示例。
1. 假设如果找到实体,您想要获取它,否则您想要获取默认值。
您可以编写:
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();
} else {
}