簡體   English   中英

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 將在幕后做的“魔法”,它是否會導致上述方法出現問題?

所描述場景中的默認接口方法用法似乎正在起作用。 我試過了,到目前為止我還沒有看到任何問題。

我仍然很高興知道是否有需要擔心的事情,如果我自己發現任何有用的東西,我會更新這篇文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM