首页 > 解决方案 > 是否可以通过继承自定义 Jpa 存储库?

问题描述

假设我有两个类:主题和客户端,主题是基类。

@Entity
public class Client extends Subject

现在我想添加自定义的 Jpa 基本接口,因此可以在子接口中访问方法:

@NoRepositoryBean
public interface SubjectRepository <T extends Subject> extends 
JpaRepository<T, Long>, CustomSubjectRepository<T> {}

CustomSubjectRepository看起来像:

public interface CustomSubjectRepository<T extends Subject> {
    void saveEncrypted(T subject);
}

我需要实现,所以我声明类:

@Repository
@Transactional
public class CustomSubjectRepositoryImpl<T extends Subject> implements 
CustomSubjectRepository<T> {

@PersistenceContext
private EntityManager entityManager;

@Override
public void saveEncrypted(T subject) {
    //implementation
}
}

然后想创建ClientRepository并从 SubjectRepository 继承访问saveEncrypted方法。

@Repository
public interface ClientRepository extends SubjectRepository<Client> {
}

但是在编译时我得到:

创建名为“clientRepository”的 bean 时出错:调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException:无法为方法 public abstract void com.path.repositories.CustomSubjectRepository.saveEncrypted(com.path.models.Subject) 创建查询!未找到类型 Client 的属性 saveEncrypted!

标签: javaspringspring-data

解决方案


您正在扩展接口,这样 Spring 将尝试创建一个名为的查询saveEncrypted,而不是使用自定义方法。

我相信最好的解决方案是扩展类CustomSubjectRepositoryImpl

@Repository
public class ClientRepository extends CustomSubjectRepositoryImpl<Client> {
}

推荐阅读