Spring JPA 存储库接口和默认方法用例

Spring JPA repository interface and default methods use case

我目前想知道是否可以通过在 JPA 存储库中使用默认接口方法来优雅地解决特定用例。

假设我们有以下实体和支持类型:

public enum Status {
   STATUS_1,
   STATUS_2,
   STATUS_3
}
 

@Entity
@Getter // from lombok
@Setter // from lombok
public class SomeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "status")
    private Status status;
}

我需要能够根据 Status 个枚举值的组合查询 SomeEntity 个列表。

使用 Spring JPA,其各自的存储库可能如下所示:

@Repository
public interface SomeRepository extends JpaRepository<SomeEntity, Integer> {

    @Query("select s.id, ... from SomeEntity s where s.status in (:statuses)")
    List<SomeEntity> getByStatuses(@Param("statuses") List<Status> statuses);
}

必须传递的特定状态组合在很大程度上取决于 SomeEntity 的域,我想在存储库调用中“嵌入”这些状态。为什么在存储库中——目前同一个存储库被多个服务使用,并且 SomeEntity 作为交易的一部分进行更新,处理根据服务的具体情况一起更新的其他实体。特定的 getByStatuses 调用对于所有服务都是相同的,我们有重复的代码片段,大致如下所示:

List<Status> statuses = Arrays.asList(Status.STATUS_1, Status.STATUS_3);
List<SomeEntity> entities = someRepository.getByStatuses(statueses);
....

我想知道我是否可以在存储库中以默认方法提取上述片段并更改我的服务以改为使用该方法:

@Repository
public interface SomeRepository extends JpaRepository<SomeEntity, Integer> {

    @Query("select s.id, ... from SomeEntity s where s.status in (:statuses)")
    List<SomeEntity> getByStatuses(@Param("statuses") List<Status> statuses);

    default List<SomeEntity> getByRelevantStatuses() {
        List<Status> relevantStatuses = Arrays.asList(Status.STATUS_1, Status.STATUS_3);
        return this.getByStatuses(relevantStatuses);
    }
}

我担心的是 Spring 幕后的“魔法”,它会导致上述方法出现问题吗?

似乎在描述的场景中使用默认接口方法是有效的。我试过了,到目前为止我还没有发现任何问题。

我仍然很乐意知道是否有需要担心的事情,如果我自己发现任何有用的东西,我会更新此 post。