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

Posted

技术标签:

【中文标题】Spring JPA 存储库接口和默认方法用例【英文标题】:Spring JPA repository interface and default methods use case 【发布时间】:2021-02-24 07:46:58 【问题描述】:

我目前想知道是否可以通过在 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 将在幕后做的“魔法”,它是否会导致上述方法出现问题?

【问题讨论】:

【参考方案1】:

看来,所描述场景中的默认接口方法使用情况正在发挥作用。我试过了,到目前为止我没有发现任何问题。

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

【讨论】:

以上是关于Spring JPA 存储库接口和默认方法用例的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Jpa:默认休眠?

Spring Data Jpa / Hades 事务行为

@Primary 等效于自动装配的 Spring JPA 存储库

Spring Data JPA + Hibernate 将方法标记为事务

Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 两种处理方法

如何在 jpa spring 存储库中使用 OrderBy?