2017-10-14 1 views
0

내 애플리케이션에서 스프링 데이터 및 JPA를 사용하고 있으며 동적 기준 API를 위해 QueryDSL을 구현하려고합니다. 내가 기준에 특정 값을 보내는 것처럼 지금까지,이 조건 이하로 사용하여 잘 작동 :QueryDSL 및 스프링 데이터에서 동적 필터 맵을 사용하여 쿼리 생성 JPA

Predicate predicate = QProductInfo.productInfo.shopName.eq(shopName).and(QProductInfo.productInfo.productType.eq(productType)); 

을하지만 여러 필터 매개 변수를 받고의 키 - 값 쌍을 저장하기 위해지도를 사용하려는 경우 (COLUMN_NAME - COLUMN_VALUE) 동적으로 쿼리를 파생시키기 위해 동일한 쿼리를 만들 수 없습니다. 술어에 조건 연산자 및/또는 다른 연산자를 추가 할 수 있다는 것을 의미하지만 사용해야하는 표현의 수는 런타임에만 결정되므로 올바른 표현식을 만드는 방법을 알 수는 없습니다. 여기

일부 코드 정보 지금

@Entity 
Public class ProductInfo{ 
productId; 
title; 
vendor; 
code; 
.... and more 
} 

필터 (1) = PRODUCT_ID = 123, 표제 = 시험 필터 2 = 표제 = XYZ 코드 = ABC 같은 값으로 1 내지 N의 필드에서 다를 수 필터 인 , vendor = pqr

지도를 사용하여 키 - 값 쌍 (title-xyz 등)을 저장하고 쿼리를 동적으로 구성하려고합니다.

많은 지침서를 읽었지만 지금까지는 내 조건에 맞는 적절한 해결책을 찾을 수 없었습니다. 나는 스위치를 사용하여지도의 루프를 반복하는 동안 생각했다. 그러나 모든 표현식/술어를 묶는 방법에 대해서는 전혀 모른다.

해결 방법을 찾지 못하면 아마도 JPA Criteria API를 사용하여 List of Predicates를 쉽게 사용할 수 있습니다. 도움이 필요한 정보가 있으면 알려주십시오.

감사

+0

술어를 구현하는 BooleanBuilder를 사용할 수 있습니다. http://www.querydsl.com/static/querydsl/3.6.3/apidocs/com/mysema/query/BooleanBuilder.html. 매개 변수가 Spring 웹 응용 프로그램에서 오는 경우 Predicate를 자동으로 생성 할 수도 있습니다. https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling # querydsl-web-support –

+0

감사합니다. 앨런. 나는 BooleanBuilder를보다 효율적으로 사용하려고 노력할 것이다. 비록 내가 여전히 실행 시간에 객체 속성을 설정하는 방법을 의심하고 있지만, 키와 값 모두가 실행 시간이 오면 키를 qproductInfo.ProductInfo로 사용하는 방법을 의미합니다. .eq (map value); 나는 그것을 시도하고 있으며 논평 할 것이다. – yateen

답변

0

나는 다음 단계를 내 문제를 해결할 수 있었다 : 나는 BooleanBuilder 및 PathBuilder을 사용했다. 여기

코드의 단편이다

BooleanBuilder builder = new BooleanBuilder(); 
PathBuilder<ProductInfo> path = new PathBuilder<>(ProductInfo.class, "productInfo"); 
    if(criteriaMap != null && !criteriaMap.isEmpty()) { 
     for (Map.Entry<String, String> entry : criteriaMap.entrySet()) { 
      builder.and(path.getString(entry.getKey()).eq(entry.getValue()));  
     } 
    } 

여기 빌더 파라미터로서 열 이름을 설정하기 위해 사용된다 (키 - 값 쌍의 형태로 열 이름 및 값을 제공한다)지도 PathBuilder에서 항목을 추가 관리 .

이를 사용하여 동적 쿼리를 만드는 데 QueryDSL을 효율적으로 사용할 수 있습니다.

감사합니다.

관련 문제