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