1. 概述

Spring Data 提供了从数据存储中检索实体的便捷方法,包括 findByIdgetById。乍看之下它们可能相似,但实际上存在一些微妙的差异,这些差异可能影响我们的代码功能。

本教程将探讨这些差异,并帮助我们确定何时有效地使用每种方法。

2. 理解 findById

2.1. 方法签名

findById 方法定义在 CrudRepository 接口中:

Optional<T> findById(ID id);

2.2. 行为和返回类型

findById 方法通过唯一的标识符(id)检索实体。它返回一个 Optional 包装,表示实体可能存在于数据存储中,也可能不存在。如果找到实体,它将被包装在 Optional 中。否则,Optional 将为空。

2.3. 使用场景

findById 在以下情况下是更好的选择:

  • 当我们期望实体在数据存储中可能不存在,并希望优雅地处理这两种情况(找到和未找到)时。
  • 当我们想与 Java 8 的 Optional API 结合使用,以便在找不到实体时执行条件操作或执行备选逻辑时也很方便。

3. 探索 getById

接下来,让我们看看 getById 方法。

3.1. 方法签名

JpaRepository 接口定义了 getById 方法:

T getById(ID id);

3.2. 行为和返回类型

findById 不同,getById 方法直接返回实体,而不是将其包装在 Optional 中。如果数据存储中不存在该实体,将抛出 EntityNotFoundException

3.3. 使用场景

我们可以使用 getById 当我们确信具有给定 id 的实体存在于数据存储中时。这种方法还提供了更简洁的语法,避免了额外的 Optional 处理需求。

4. 选择合适的方法

最后,考虑以下几个因素可以帮助我们决定使用 findById 还是 getById

  • 存在保证:如果实体的存在是确定的,且缺失时会出现异常情况,那么优先选择 getById。这种方法避免了不必要的 Optional 处理,简化了代码。
  • 可能的缺失:如果实体的存在性不确定,或者我们需要优雅地处理找到和未找到的情况,那么使用 findById 以及 Optional API。这种方式允许我们在不抛出异常的情况下执行条件操作。
  • 自Spring Boot 2.7版本起,getById 方法被标记为已弃用,文档推荐使用 getReferenceById 方法替代。

5. 总结

在这篇教程中,我们了解了Spring Data中 findByIdgetById 方法的区别。虽然 findById 返回一个 Optional 并优雅地处理实体的缺失,而 getById 直接返回实体并在不存在时抛出异常。选择两者之间的方法取决于实体是否存在以及是否需要异常处理或条件操作。

因此,我们应该根据应用的逻辑和需求选择最适合的方法。