使用泛型将自定义方法添加到JPARepository

时间:2017-02-20 05:39:08

标签: hibernate spring-data spring-data-jpa

假设我有一个名为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'

我错过了什么?

2 个答案:

答案 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;
    }



}

这让我工作了!