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

问题描述

我目前想知道是否可以通过在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;
}

我需要能够基于SomeEntity枚举值的组合来查询Status的列表。

使用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,... 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将在幕后进行的“魔术”,是否可能导致上述方法出现问题?

解决方法

似乎在所描述的方案中默认的接口方法用法正在起作用。我尝试过,到目前为止,还没有发现任何问题。

我仍然很高兴知道是否有需要担心的事情,如果我自己有什么用的话,我将更新这篇文章。