001package org.granite.tide.spring.data; 002 003import java.io.Serializable; 004 005import javax.persistence.EntityManager; 006 007import org.springframework.data.jpa.repository.JpaRepository; 008import org.springframework.data.jpa.repository.support.JpaRepositoryFactory; 009import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean; 010import org.springframework.data.repository.core.RepositoryMetadata; 011import org.springframework.data.repository.core.support.RepositoryFactorySupport; 012 013public class FilterableJpaRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable> extends JpaRepositoryFactoryBean<R, T, I> { 014 015 @Override 016 protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) { 017 return new FilterableJpaRepositoryFactory<T, I>(entityManager); 018 } 019 020 private static class FilterableJpaRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory { 021 022 private EntityManager entityManager; 023 024 public FilterableJpaRepositoryFactory(EntityManager entityManager) { 025 super(entityManager); 026 027 this.entityManager = entityManager; 028 } 029 030 @SuppressWarnings("unchecked") 031 @Override 032 protected Object getTargetRepository(RepositoryMetadata metadata) { 033 return new FilterableJpaRepositoryImpl<T, I>((Class<T>)metadata.getDomainType(), entityManager); 034 } 035 036 @Override 037 protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) { 038 return FilterableJpaRepository.class; 039 } 040 } 041}