복붙노트

[SPRING] spring-data-mongo - 선택적 쿼리 매개 변수?

SPRING

spring-data-mongo - 선택적 쿼리 매개 변수?

JSON 기반 쿼리 메서드와 함께 spring-data mongo를 사용하고 있으며 검색 쿼리에서 선택적 매개 변수를 허용하는 방법을 잘 모르고 있습니다.

예를 들어 - 내가 다음과 같은 기능을했다

@Query("{ 'name' : {$regex : ?0, $options : 'i'}, 'createdDate' : {$gte : ?1, $lt : ?2 }} }")
List<MyItem> getItemsLikeNameByDateRange(String name, Date startDateRange, Date endDateRange);

하지만 정규식 일치를 적용하고 싶지 않거나 NULL 값이 메서드에 전달 된 경우 날짜 범위 제한을 적용하지 않습니다.

지금은 mongoTemplate을 사용하여 쿼리를 작성해야하는 것처럼 보입니다.

어떤 대안이 있습니까? 아니면 mongoTemplate을 최선의 방법으로 사용하고 있습니까?

감사

해결법

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

    1.이를 부울 논리로 구현하려면 다음을 수행하고 프로그래밍 언어에서 사용할 수있는 연산으로 변환합니다

    이를 부울 논리로 구현하려면 다음을 수행하고 프로그래밍 언어에서 사용할 수있는 연산으로 변환합니다

    :query != null -> field == :query
    !(:query != null) || (field == :query)
    (:query == null) || (field == :query)
    

    일반 SQL에서는 다음과 같이 수행됩니다.

    where (null = :query) or (field = :query)
    

    MongoDB에서 이것은 $를 통해 이루어집니다.

    { $where: '?0 == null || this.field == ?0' } 
    

    약간의 가독성을 희생하면서 함수에 모든 것을 구현하는 대신 Mongo Operations를 사용하여 조금 더 빠르게 할 수 있습니다. 불행히도 작동하지 않습니다.

    { $or : [ { $where: '?0 == null' } , { field : ?0 } ] } 
    

    그럼 네가 가진 것은

    @Query("{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] }")
    List<Something> findAll(String query, Pageable pageable);
    

    이것은 in / all 절에 대한 배열을 처리하도록 더 확장 될 수 있습니다.

    @Query("{ $or : [ { $where: '?0.length == 0' } , { field : { $in : ?0 } } ] }")
    List<Something> findAll(String query, Pageable pageable);
    
  2. ==============================

    2.이 문제에 대한 피드백이나 투표에 관심이 있으실 것입니다. https://jira.springsource.org/browse/DATAJPA-209

    이 문제에 대한 피드백이나 투표에 관심이 있으실 것입니다. https://jira.springsource.org/browse/DATAJPA-209

    이 문제는 SD JPA를 제외하고는 정확히 처리됩니다. 다른 많은 SD 하위 프로젝트에 적합한 것처럼 보입니다.

  3. ==============================

    3.주어진 티켓은 "name magic"으로 SQL을 생성하는 파인더를 처리합니다. findByTitleAndSubtitle (). 이제 정상적으로 작동합니다. 그러나이 찾기에 @Query 주석을 달 때 ( "title = : title 및 subtitle = : subtitle"이라는 제품을 선택하십시오); null 값은 "subtitle = null"로 변환되므로 찾을 수 없습니다.

    주어진 티켓은 "name magic"으로 SQL을 생성하는 파인더를 처리합니다. findByTitleAndSubtitle (). 이제 정상적으로 작동합니다. 그러나이 찾기에 @Query 주석을 달 때 ( "title = : title 및 subtitle = : subtitle"이라는 제품을 선택하십시오); null 값은 "subtitle = null"로 변환되므로 찾을 수 없습니다.

  4. from https://stackoverflow.com/questions/11613464/spring-data-mongo-optional-query-parameters by cc-by-sa and MIT license