Java SpringDataJPA如何为多个实体构建通用存储库?

Java SpringDataJPA如何为多个实体构建通用存储库?,java,generics,spring-data-jpa,Java,Generics,Spring Data Jpa,我开始使用Spring数据JPA存储库。我们已经有了一个使用SpringMVC(没有SpringBoot或SpringDataJPA)的应用程序,其中我们已经编写了一个通用DAO类,该类可以处理几乎所有实体的基本CRUD操作。任何其他特殊操作都可以通过编写自定义DAO来处理 现在,SpringDataJPA让事情变得非常简单,它只需要我们编写一个接口,其余的就可以了 public interface PersonRepository extends JpaRepository<Person

我开始使用Spring数据JPA存储库。我们已经有了一个使用SpringMVC(没有SpringBoot或SpringDataJPA)的应用程序,其中我们已经编写了一个通用DAO类,该类可以处理几乎所有实体的基本CRUD操作。任何其他特殊操作都可以通过编写自定义DAO来处理

现在,SpringDataJPA让事情变得非常简单,它只需要我们编写一个接口,其余的就可以了

public interface PersonRepository extends JpaRepository<Person, Long> {

}
这可能是因为泛型类型

我不得不说,我的实体本身是独立的类,不实现或扩展超级实体。如果他们这样做会有帮助吗

请给我指引正确的方向


谢谢

我想你可以这样做:

@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
   //added custom common functionality for all the GenericRepository implementations
   public List<T> findByAttributeContainsText(String attributeName, String text);
}

public class GenericRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
    implements GenericRepository<T, ID> {

   private EntityManager entityManager;

   public GenericRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
    super(entityInformation, entityManager);
    this.entityManager = entityManager;
}

@Transactional
public List<T> findByAttributeContainsText(String attributeName, String text) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<T> cQuery = builder.createQuery(getDomainClass());
    Root<T> root = cQuery.from(getDomainClass());
    cQuery.select(root).where(builder.like(root.<String>get(attributeName), "%" + text + "%"));
    TypedQuery<T> query = entityManager.createQuery(cQuery);
    return query.getResultList();
}
}
public interface MyOtherRepository extends GenericRepository<Role, Long> {

}

那么呢?服务方法不应该用@Transactional而不是repo来注释吗?
@Autowired
private GenericRepository<Person> personRepository;

public List<Person> findAll() {
     return this.personRepository.findAll();
}
Error creating bean with name 'genericRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object
@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
   //added custom common functionality for all the GenericRepository implementations
   public List<T> findByAttributeContainsText(String attributeName, String text);
}

public class GenericRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
    implements GenericRepository<T, ID> {

   private EntityManager entityManager;

   public GenericRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
    super(entityInformation, entityManager);
    this.entityManager = entityManager;
}

@Transactional
public List<T> findByAttributeContainsText(String attributeName, String text) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<T> cQuery = builder.createQuery(getDomainClass());
    Root<T> root = cQuery.from(getDomainClass());
    cQuery.select(root).where(builder.like(root.<String>get(attributeName), "%" + text + "%"));
    TypedQuery<T> query = entityManager.createQuery(cQuery);
    return query.getResultList();
}
}
public interface MyOtherRepository extends GenericRepository<Role, Long> {

}
@Configuration
@EnableJpaRepositories(basePackages="com.myProject", repositoryBaseClass = 
GenericRepositoryImpl.class)
public class JpaConfig {

}