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

Iva*_*vov 8 java spring spring-data-jpa default-method

我目前想知道是否可以通过使用 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;
}
Run Code Online (Sandbox Code Playgroud)

我需要能够查询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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*vov 6

看来所描述的场景中的默认接口方法用法是有效的。我尝试过,到目前为止我还没有看到任何问题。

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