【发布时间】: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 将在幕后做的“魔法”,它是否会导致上述方法出现问题?
【问题讨论】:
标签: java spring spring-data-jpa default-method