问题描述
我目前想知道是否可以通过在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将在幕后进行的“魔术”,是否可能导致上述方法出现问题?
解决方法
似乎在所描述的方案中默认的接口方法用法正在起作用。我尝试过,到目前为止,还没有发现任何问题。
我仍然很高兴知道是否有需要担心的事情,如果我自己有什么用的话,我将更新这篇文章。