복붙노트

[SPRING] 스프링 데이터 REST로 고급 검색을 수행하는 방법은 무엇입니까?

SPRING

스프링 데이터 REST로 고급 검색을 수행하는 방법은 무엇입니까?

내 작업은 Spring Data REST로 고급 검색을 만드는 것이다. 어떻게 구현할 수 있습니까?

나는 이처럼 간단한 검색을하는 방법을 만들었다.

public interface ExampleRepository extends CrudRepository<Example, UUID>{

    @RestResource(path="searchByName", rel="searchByName")
    Example findByExampleName(@Param("example") String exampleName);

}

이 예제는 URL로 간단히 가야하는 경우 완벽하게 작동합니다.

.../api/examples/search/searchByName?example=myExample

그러나 검색 할 필드가 두 개 이상인 경우 어떻게해야합니까?

예를 들어, 예제 클래스에 5 개의 필드가있는 경우 모든 possibiles fileds로 고급 검색을 수행하려면 어떤 구현을해야합니까?

이것을 고려해보십시오 :

.../api/examples/search/searchByName?filed1=value1&field2=value2&field4=value4

그리고 이것:

.../api/examples/search/searchByName?filed1=value1&field3=value3

이 검색을 적절한 방식으로 구현하려면 어떻게해야합니까?

감사.

해결법

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

    1.Spring Data Rest는 QueryDSL을 웹 지원과 통합하여 고급 검색 요구 사항에 사용할 수 있습니다. QueryDslPredicateExecutor를 구현하기 위해 저장소를 변경해야하며 모든 작업이 즉시 수행됩니다.

    Spring Data Rest는 QueryDSL을 웹 지원과 통합하여 고급 검색 요구 사항에 사용할 수 있습니다. QueryDslPredicateExecutor를 구현하기 위해 저장소를 변경해야하며 모든 작업이 즉시 수행됩니다.

    다음은이 기능에 대한 블로그 기사의 샘플입니다.

    $ http :8080/api/stores?address.city=York    
    {
        "_embedded": {
            "stores": [
                {
                    "_links": {
                        …
                    }, 
                    "address": {
                        "city": "New York", 
                        "location": { "x": -73.938421, "y": 40.851 }, 
                        "street": "803 W 181st St", 
                        "zip": "10033-4516"
                    }, 
                    "name": "Washington Hgts/181st St"
                }, 
                {
                    "_links": {
                        …
                    }, 
                    "address": {
                        "city": "New York", 
                        "location": { "x": -73.939822, "y": 40.84135 }, 
                        "street": "4001 Broadway", 
                        "zip": "10032-1508"
                    }, 
                    "name": "168th & Broadway"
                }, 
                …
            ]
        }, 
        "_links": {
            …
        }, 
        "page": {
            "number": 0, 
            "size": 20, 
            "totalElements": 209, 
            "totalPages": 11
        }
    }
    
  2. ==============================

    2.상당히 많은 문서가 구식이긴하지만 Spring 레퍼런스 문서와 수많은 기술 블로그에 널리 문서화 된 쿼리 메소드의 구현.

    상당히 많은 문서가 구식이긴하지만 Spring 레퍼런스 문서와 수많은 기술 블로그에 널리 문서화 된 쿼리 메소드의 구현.

    귀하의 질문은 아마도 "findBy * 메소드를 엄청나게 선언하지 않고도 필드의 조합으로 다중 매개 변수 검색을 수행 할 수 있습니까?"라는 대답은 Spring에서 지원하는 Querydsl입니다.

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

    3.이 작업을위한 효과적인 해결책을 찾았습니다.

    이 작업을위한 효과적인 해결책을 찾았습니다.

    @RepositoryRestResource(excerptProjection=MyProjection.class)
    public interface MyRepository extends Repository<Entity, UUID> {
    
        @Query("select e from Entity e "
              + "where (:field1='' or e.field1=:field1) "
              + "and (:field2='' or e.field2=:field2) "
              // ...
              + "and (:fieldN='' or e.fieldN=:fieldN)"
        Page<Entity> advancedSearch(@Param("field1") String field1,
                                   @Param("field2") String field2,
                                   @Param("fieldN") String fieldN,
                                   Pageable page);
    
    }
    

    이 솔루션을 사용하면이 기본 URL을 사용합니다.

    http://localhost:8080/api/examples/search/advancedSearch
    

    우리는 필요한 모든 분야를 대상으로 고급 검색을 수행 할 수 있습니다.

    몇 가지 예 :

    http://localhost:8080/api/examples/search/advancedSearch?field1=example
        // filters only for the field1 valorized to "example"
    
    http://localhost:8080/api/examples/search/advancedSearch?field1=name&field2=surname
        // filters for all records with field1 valorized to "name" and with field2 valorized to "surname"
    
  4. ==============================

    4.나는 당신이 다음과 같이 시도 할 수 있다고 생각한다 :

    나는 당신이 다음과 같이 시도 할 수 있다고 생각한다 :

    List findDistinctPeopleByLastnameOrFirstname (@Param ( "lastName") 문자열 성, @Param ( "firstName") 문자열 이름);

    예제 / 검색 / searchByLastnameOrFirstname? firstName = value1 & lastName = value2

    체크 아웃 : http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation

  5. ==============================

    5.나는 Query by Example을 사용하여이를 구현했다.

    나는 Query by Example을 사용하여이를 구현했다.

    다음과 같은 모델이 있다고 가정 해 보겠습니다.

    @Entity
    public class Company {
    
      @Id
      @GeneratedValue
      Long id;
    
      String name;
      String address;
    
      @ManyToOne
      Department department;
    
    }
    
    
    @Entity
    public class Department {
    
      @Id
      @GeneratedValue
      Long id;
    
      String name;
    
    }
    

    그리고 저장소 :

    @RepositoryRestResource
    public interface CompanyRepository extends JpaRepository<Company, Long> {
    }
    

    JpaRepository는 QueryByExampleExecutor를 구현합니다.

    이제 사용자 정의 컨트롤러를 구현합니다.

    @RepositoryRestController
    @RequiredArgsConstructor
    public class CompanyCustomController {
    
      private final CompanyRepository repository;
    
      @GetMapping("/companies/filter")
      public ResponseEntity<?> filter(
          Company company,
          Pageable page,
          PagedResourcesAssembler assembler,
          PersistentEntityResourceAssembler entityAssembler
      ){
    
        ExampleMatcher matcher = ExampleMatcher.matching()
            .withIgnoreCase()
            .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING);
    
        Example example = Example.of(company, matcher);
    
        Page<?> result = this.repository.findAll(example, page);
    
        return ResponseEntity.ok(assembler.toResource(result, entityAssembler));
    
      }
    }
    

    그런 다음 아래와 같은 쿼리를 작성할 수 있습니다.

    localhost:8080/companies/filter?name=google&address=NY
    

    다음과 같이 중첩 된 항목을 쿼리 할 수도 있습니다.

    localhost:8080/companies/filter?name=google&department.name=finances
    

    간결함을 위해 몇 가지 세부 사항을 생략했지만 Github에 대한 작업 예제를 만들었습니다.

  6. from https://stackoverflow.com/questions/36222830/how-to-make-an-advanced-search-with-spring-data-rest by cc-by-sa and MIT license