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