2016-05-23 23 views
5

Środowisko:sprężyną danych MongoDB zapytanie przecięcia i wstrzykiwać orzeczenie lub specyfikacji

sprężyny danych Mongo: 1.7.0.RC1 Mongo-Java kierowcy: 3.2.2

dokumentu

@Document(collection = "products") 
public class Product { 

    @Id 
    private String sid; 

    private String name; 

    private Long vendor; 

    (...) 
} 

repozytorium :

public interface ProductRepository extends MongoRepository<Product, String> { 

    Product findByName(String productName); 

} 

Moje goa Mam przechwycić każde zapytanie wykonane w kolekcji Product i dodać predykat lub specyfikację bez modyfikowania repozytorium lub potrzeby wdrożenia metody findByNameAndBelongsToVendorList.

muszę to przechwytujących lub AspectJ bo mam wiele metod, takich jak:

Page<Product> findAll(Pageable page); 

List<Product> findByCategory(String category, Pageable pageRequest); 

(...) 

Cel

findByName // perform a filter by name (explicit) 
      // and a filter by vendor (injected via inteceptor or aspecJ) 

unikać robienia tego

@Repository 
public class ProductRepositoryCustomImpl implements ProductRepositoryCustom { 

    @Autowired 
    private MongoTemplate template; 

    public Product findByNameAndBelongsToVendorList(String name, List<Long> vendors, Pageable pageRequest) { 

     Criteria criteriaVendor = Criteria.where("vendors").in(vendors); 
     Query query = new Query(criteriaVendor); 
     query.with(pageRequest); 

     return template.findOne(query, Product.class); 
    } 
} 

Odpowiedz

0

Aspekty powinien wykonać sztuczka.

@Aspect 
public class YourAspect { 

    @Autowired 
    private MongoTemplate template; 

    @Pointcut("execution(public * findByName(..))") 
    private void findByName() { 
    } 

    @Pointcut("within(com.leonel.repository.ProductRepository)") 
    private void repository() { 
    } 

    @Around("repository() && findByName()") 
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable { 
     Object[] args = pjp.getArgs(); 
     String name = (String) args[0]; 

     Criteria newCriteria = YOUR NEW LOGIC HERE; 
     Query query = new Query(newCriteria); 

     return template.find(query, Your.class); 
    } 

Polecam przeciwko niej jednak, ponieważ wprowadza trochę magii do swojego kodu i zapytań manipulacji nie powinno być problemem aspektów. Jaki jest powód, dla którego chcesz uniknąć wielu metod wyszukiwania w twoim repozytorium?

+0

Obecnie używam 2 frameworki ... SpringData e MongoTemplate. Z MongoTemplate mogę używać pointcut na * org.springframework.data.mongodb.core * i przechwytywać wszystkie metody takie jak findAll, findOne ... ale z SpringData nie wiem jeszcze jak to zrobić. – Leonel