默认情况下,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(); // concatenation code is not tested hence u need to fix it
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;
}
}
}
最后,通过使用@EnableJpaRepositories 注释并指定您的类,在Spring 配置中配置您的BaseRepositoryFactoryBean,如下所示。这将告诉 JPA 要调用哪个 RepositoryFactoryBean ,而哪个 RepositoryFactoryBean 又会告诉整个使用哪个 JPA 存储库,并使用其 Impl 类对其实现进行初始化。
@EnableJpaRepositories(basePackages = {"com.test.jpa.custom.repository"},
repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class)
class Configuration{}
现在您可以使用BaseRepository,findByIdsIn 将在您的整个应用程序中使用。