默认情况下,SimpleJpaRepository
是基本存储库操作的实现。您应该实现并编写一个继承SimpleJpaRepository
的类。将两种类型参数作为传递给接口SimpleJpaRepository
的实现的泛型类型。以下是符合您要求的示例实现:
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import java.io.Serializable;
import java.util.Optional;
public class BaseRepositoryImpl <T, ID extends Serializable>
extends SimpleJpaRepository<T, ID> implements BaseRepository<T, ID> {
private final EntityManager entityManager;
public BaseRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {
super(domainClass, entityManager);
this.entityManager = entityManager;
}
@Override
public List<T> findByIdsIn(List<ID> ids) {
List<T> entities = entityManager.createQuery(
"FROM"+this.getDomainClass()+" WHERE id IN ("+CommonUtils.concat(ids,',')+")").getResultList();
return entities;
}
}
此外,您需要覆盖默认实现,即
SimpleJpaRepository
,使用您自己的实现,即
BaseRepositoryImpl
。
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
import javax.persistence.EntityManager;
import java.io.Serializable;
public class BaseRepositoryFactoryBean<R extends JpaRepository<T, I>, T,
I extends Serializable> extends JpaRepositoryFactoryBean<R, T, I> {
@Override
protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
return new BaseRepositoryFactory(entityManager);
}
private static class BaseRepositoryFactory<T, I extends Serializable>
extends JpaRepositoryFactory {
private final EntityManager entityManager;
public BaseRepositoryFactory(EntityManager entityManager) {
super(entityManager);
this.entityManager = entityManager;
}
@Override
protected Object getTargetRepository(RepositoryMetadata metadata) {
return new BaseRepositoryImpl<T, I>((Class<T>) metadata.getDomainType(), entityManager);
}
@Override
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
return BaseRepositoryImpl.class;
}
}
}
最后,在Spring配置中使用
@EnableJpaRepositories
注释并指定以下类来配置您的
BaseRepositoryFactoryBean
。这将告诉JPA调用哪个RepositoryFactoryBean,并进而告诉哪个JPA存储库在整个过程中使用它,并使用其Impl类初始化它的实现。
@EnableJpaRepositories(basePackages = {"com.test.jpa.custom.repository"},
repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class)
class Configuration{}
现在你可以使用BaseRepository
,并且findByIdsIn
将在整个应用程序中可用。