[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.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.상당히 많은 문서가 구식이긴하지만 Spring 레퍼런스 문서와 수많은 기술 블로그에 널리 문서화 된 쿼리 메소드의 구현.
상당히 많은 문서가 구식이긴하지만 Spring 레퍼런스 문서와 수많은 기술 블로그에 널리 문서화 된 쿼리 메소드의 구현.
귀하의 질문은 아마도 "findBy * 메소드를 엄청나게 선언하지 않고도 필드의 조합으로 다중 매개 변수 검색을 수행 할 수 있습니까?"라는 대답은 Spring에서 지원하는 Querydsl입니다.
-
==============================
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.나는 당신이 다음과 같이 시도 할 수 있다고 생각한다 :
나는 당신이 다음과 같이 시도 할 수 있다고 생각한다 :
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.나는 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에 대한 작업 예제를 만들었습니다.
from https://stackoverflow.com/questions/36222830/how-to-make-an-advanced-search-with-spring-data-rest by cc-by-sa and MIT license