自定义通用Spring数据存储库

时间:2019-09-01 00:11:10

标签: java spring spring-data-jpa spring-data

使用spring数据,我有两个共享相同结构的表。 这两个表由两个不同的实体表示,它们从同一类继承:

@MappedSuperclass
public abstract class SuperEntity<T extends SuperEntity> {
// ...
}

@Table(name = "FOO")
@Entity
public class Foo extends SuperEntity<Foo> {
// ...
}

@Table(name = "BAR")
@Entity
public class Bar extends SuperEntity<Bar> {
// ...
}

我还有一个通用存储库,我想使用它来分解请求逻辑,以及两个子存储库:每个表一个。

public interface GenericEvtRepository <T extends SuperEntity<?>> extends JpaRepository<T, String> { }

public interface FooRepository extends GenericEvtRepository<Foo>  {}

public interface BarRepository extends GenericEvtRepository<Bar>  {}

我想向该存储库添加实际的查询实现(即使用EntityManager / Criteria)。 因此,我尝试使自定义存储库策略适应我的一般情况

@Repository
public class GenericEvtRepositoryImpl<T extends SuperEntity<?>> extends SimpleJpaRepository<T, String> implements GenericEvtRepository<T>  {

    @PersistenceContext
    EntityManager entityManager;

    // Some logic using entityManager
   public SuperEntity myCustomRequest() { /*...*/ }
}

但是我的应用程序没有启动,除了:

org.springframework.data.mapping.PropertyReferenceException: No property myCustomRequest found for type Foo!

不确定我在做什么错,但是Spring似乎认为myCustomRequest是我实体的属性,而不是方法。

我正在使用spring-boot 1.5.6和spring-data-jpa 1.11.6。

Minimal reproductible exemple

1 个答案:

答案 0 :(得分:1)

幸运的是,我能够重现您的问题,

在春季文档中here中指定了春季如何建议自定义存储库实施。

因此,您可以执行以下操作

public interface CustomEntityRepository<T extends SuperTag<?>>
public interface FooRepository extends JpaRepository<Foo, Integer>, CustomEntityRepository<Foo>
public interface BarRepository extends JpaRepository<Bar, Integer>, CustomEntityRepository<Bar>

并为CustomEntityRepository<T extends SuperTag<?>>定义常见实施,如下所示,

@Repository
// NOTE: Implementation name must follow convension as InterfaceName + 'Impl'
public class CustomEntityRepositoryImpl<T extends SuperTag<?>>  implements 
CustomEntityRepository<T> {

   @PersistenceContext
   private EntityManager entityManager;

   // Generic custom implementation here
}

Spring根据实现类命名约定自动检测自定义接口CustomEntityRepository的实现。