Java SpringDataJPA如何为多个实体构建通用存储库?
我开始使用Spring数据JPA存储库。我们已经有了一个使用SpringMVC(没有SpringBoot或SpringDataJPA)的应用程序,其中我们已经编写了一个通用DAO类,该类可以处理几乎所有实体的基本CRUD操作。任何其他特殊操作都可以通过编写自定义DAO来处理 现在,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
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 {
}