spring-data-jpa 将泛型作为实体类型的Spring Data 存储库

zqry0prt  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(188)

我想在我的项目中使用SpringDataJPA存储库。

interface ProductRepository extends JPARepository<Product, Long>

然而,我想提供一个更复杂的案例,它符合以下条件:
1.我有一个基本的具有共同定义的实体:

@MappedSuperclass
public abstract class AbstractBaseEntity {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    @Column(name = "ID", nullable = false)
    private Long id;
    ...
}

1.我有所有其他实体扩展上面的一个,例如:

@Entity
@Table(name = "bread")
public class Bread extends AbstractBaseEntity {
@Column
String type;
...
}

@Entity
@Table(name = "butter")
public class Butter extends AbstractBaseEntity {
@Column
String weight;
...
}

1.我希望任何人创建的任何存储库都只能与扩展AbstractBaseEntity的实体一起工作。所以我想做这样的事情:
public interface MyBaseRepository<T> extends JpaRepository<T extends AbstractBaseEntity, Long>
然后定义几个常用方法,并按如下所示使用它:
public interface BreadRepository <Bread, Long> extends MyBaseRepository

公共接口ButterRepository扩展了MyBaseRepository
问题是我不能这样做。当我定义MyBaseRepository时,如果我用途:
MyBaseRepository<T extends AbstractBaseEntity> extends JpaRepository<T, Long>
我在运行真实的查询时遇到了“实体没有属性类型”的错误。如果我只使用
扩展JpaRepository
我得到一个对象未Map的错误。如果我尝试
JpaRepository<T extends AbstractBaseEntity , Long>
它只是由于意外的绑定错误而失败。
我是否遗漏了什么,或者只是无法使用Spring Data JPA?
谢谢你!

mwg9r5ms

mwg9r5ms1#

我知道这是一个旧的线程,但我有同样的错误,试图定义一个像你的MyBaseRepository<T extends AbstractBaseEntity> extends JpaRepository<T, Long>仓库。
在我的例子中,错误是:
无法为方法公共抽象MyBaseRepository.someMethod()创建查询;非实体:抽象基本实体
问题是JPA试图实现扩展JpaRepository的所有接口,但不能在MyBaseRepository<T>上实现,因为<T>不是具体类,AbstractBaseEntity不是@Entity
解决方案是用@NoRepositoryBean注解MyBaseRepository<T>,以防止JPA尝试实现这个存储库,因此,只有BreadRepository将被实现。

相关问题