복붙노트

[REDIS] 어떻게 봄 데이터 레디 스 저장소와 동적 쿼리를 구축?

REDIS

어떻게 봄 데이터 레디 스 저장소와 동적 쿼리를 구축?

이 같은 저장소를 사용하여 봄 - 데이터 - 레디 스와 레디 스를 테스트하고 있습니다 :

public interface CreditCardRepository extends CrudRepository<CreditCard, String>{
    List<CreditCard> findByIssuer(String issuer);
    List<CreditCard> findByCreditNetwork(String creditNetwork);
    List<CreditCard> findByCreditNetworkAndIssuer(String creditNetwork, String issuer);
}

위의 방법은 레디 스 구조 등을 통해 쿼리합니다 :

creditcard:creditNetwork:mastercard
creditcard:creditNetwork:visa
creditcard:issuer:company1
creditcard:issuer:company2

지금 내 크레딧 카드 객체는 그래서 같은 객체를 검색 할 쉽게, 두 가지 속성 (발행, 네트워크 및 ID를) 포함

private List<CreditCard> searchCardFromCache(CreditCardGetReq req) {
    if (req.getIssuer() != null && req.getNetwork() != null) { 
        return ccRepository.findByIssuerAndCreditNetwork(req.getIssuer(), req.getNetwork().name()); 
    }
    if (req.getIssuer() != null) { 
        return ccRepository.findByIssuer(req.getIssuer()); 
    }
    if (req.getNetwork() != null) { 
        return ccRepository.findByCreditNetwork(req.getNetwork().name()); 
    }
    return null;
}

나는 모든 속성의 조합을 만들어야합니다 매우 지저분한 것 때문에,이 코드 좋아하지 않는다. '만약'체인 수없는, 그래서 앞으로 나는 15 개 특성을 가지고 계획이다.

레디 스 각 속성을 확인보다 더 나은 방법으로 개체 속성에 따라 교차로를 반환 할 수 있도록 내가 봄 - 데이터 - 레디 스를 사용하여 동적 쿼리를 만들 수있는 방법을 부탁드립니다?

이와 같이 생성 된 동적 될 메소드 이름 (내가 이전 저장소 findByIssuerAndCreditNetwork에서 삭제) 하드 코딩에 의해 MethodHandle를 사용하여 시도했다 :

MethodType methodType = MethodType.methodType(cardList.getClass(), String.class, String.class);
// Dynamic create 'findByIssuerAndCreditNetwork'
MethodHandle methodHandle = MethodHandles.lookup().findVirtual(CreditCardRepository.class, "findByIssuerAndCreditNetwork", methodType);

하지만 오류가 아래에있어 이후 MethodHandle 작동하지 않는 것 같습니다 :

해결법

  1. ==============================

    1.현재, 동적 쿼리를 생성 할 지원이 없습니다. 그것은 조금 소리 예에 의한 질의 당신이 찾고있는 일이 될 수있는 것처럼. 봄 데이터 MongoDB를하고 스프링 데이터 JPA는 이미 예에 의해 쿼리를 구현한다.

    현재, 동적 쿼리를 생성 할 지원이 없습니다. 그것은 조금 소리 예에 의한 질의 당신이 찾고있는 일이 될 수있는 것처럼. 봄 데이터 MongoDB를하고 스프링 데이터 JPA는 이미 예에 의해 쿼리를 구현한다.

    쿼리는 예를 들어 도메인 객체에 맞게 데이터 저장소 모듈에 의해 생성된다 :

    Person person = new Person();                         
    person.setFirstname("Dave");                          
    
    Example<Person> example = Example.of(person); 
    
    MongoRepository repo = …
    List<Person> result = repo.findAll(example); // returns all objects that with Dave in firstname
    

    예에 의한 쿼리 지금 봄 데이터 레디 스를 지원하지 않습니다하지만 기본적인 지원을 제공 할 수 있어야한다.

    나는이 기능의 진행 상황을 추적 티켓 DATAREDIS-605을 만들었습니다.

  2. from https://stackoverflow.com/questions/42518900/how-to-build-dynamic-queries-with-spring-data-redis-repositories by cc-by-sa and MIT license