假设我有一个名为Product
的实体。我设计了一个回购
@Repository
interface ProductRepository implements JPARepository<Product, Integer>{}
这将继承所有默认方法,例如save, findAll
等;
现在我想要一个自定义方法,这也是其他实体的常用方法。我添加了另一个界面和实现
interface CustomRepository<T,ID>{ public void customMethod() }
class CustomRepositoryImpl implements CustomRepository<T,ID>{ public void customMethod(){} }
我将ProductRepository重写为
@Repository
interface ProductRepository implements
JPARepository<Product, Integer>,
CustomRepository<Product, Integer>
{}
现在,这不会给我任何编译错误。但是在运行时,我收到了这个错误:
找不到产品
的属性'customMethod'
我错过了什么?
答案 0 :(得分:3)
您似乎正在尝试将自定义行为添加到单个存储库,即ProductRepository
。但是,代码的结构就像需要将自定义行为添加到所有存储库一样(CustomRepository
并非特定于Product
)。因此,错误。
第1步:声明自定义存储库
interface CustomRepository<T, ID extends Serializable> {
void customMethod();
}
第2步:将自定义行为添加到所需的存储库
interface ProductRepository extends CrudRepository<Product, Integer>
, CustomRepository<Product, Integer> {}
第3步:添加
Product
具体实施
class ProductRepositoryImpl implements CustomRepository<Product, Integer> { ... }
注意:对于Spring Data JPA管道,该类必须命名为ProductRepositoryImpl
才能自动获取它。
有一个工作示例on Github。
如果您希望向所有存储库添加自定义行为,请参阅官方文档中的relevant section。
答案 1 :(得分:0)
确定。这适用于那些试图在SpringBoot应用程序中完成此工作的人
按照@manish发布的内容进行操作。这里的工作代码Working Code
你只需做一个小改动。 将Model类定义为
@MappedSuperclass
@IdClass(ModelID.class)
public abstract class Model implements Serializable
将ID类定义为
public class ModelID implements Serializable{
@Column(name = "id")
@Generated(GenerationTime.INSERT)
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
这让我工作了!