본문으로 건너뛰기
ElastiCORE 3.0 은 릴리스 후보(RC)입니다: Maven Central 의 3.0.261022-rc1. 2.2 라인 프로젝트는 2.2 문서를 보세요.
버전: 3.0

검색과 정렬

@expose 엔티티는 모두 검색 DTO(XxxSrchDTO)와 POST /api/<도메인>/<엔티티>/search 를 받습니다. 필드의 @search(조건) 이 그 필드를 어떻게 검색할지 정합니다(@s, @srch, @filter 도 같음). 쉼표 뒤의 두 번째 값은 엔티티 필드 이름입니다(@search(like,comName)).

POST /api/shop/product/search
{ "name": "fish", "pageNumber": 0, "pageSize": 20, "sortCode": "name+" }

답은 페이지입니다: content, totalElements, totalPages, number. pageNumber 는 0 부터 셉니다.

조건​

DSLCriteria대소문자 무시뜻
eq, =equal아니오정확 일치
likelike (%v%)v3: 예 / 2.x 호환: 아니오값의 일부
%_%, %%like (%v%)아니오값의 일부, 대소문자 구분 - 모든 모드
%__%like (%v%)예값의 일부, 대소문자 무시
__=, =__equal예정확 일치, 대소문자 무시
_% / %_like (v% / %v)아니오접두사 / 접미사
__% / %__like예접두사 / 접미사, 대소문자 무시
>, >=, <, <=비교아니오
in.in()아니오여러 값 중 하나 (status: List<Status> @search(in))
between, ~between아니오<필드>From 과 <필드>To
isnullisNull / isNotNull아니오비어 있는지: 검색 속성 <필드>Empty: Boolean (v3 번들)
auto (@search 만)실행 시 결정아니오문자열 전용: 값이 % 로 시작하거나 끝나면 like, 아니면 eq
v3 의 like 는 대소문자를 무시합니다

v3 모드(헥사고날, DDD, -Pv3, 모든 Kotlin 빌드)에서 문자열 필드의 @search(like) 는 %__% 와 같습니다: 값의 앞뒤 공백을 지우고 로캘과 무관하게 소문자로 바꾼 뒤(Locale.ROOT), 컬럼을 lower(...) 로 비교합니다. {"name":"gold"} 가 Goldfish 를 찾습니다. 레이어드 Java 의 2.x 호환 출력은 대소문자를 구분합니다. v3 에서 구분하려면 @search(%_%).

  • 호출자가 값에 넣은 %·_ 는 그대로 와일드카드입니다({"name":"%Puppy%"}).
  • 미구현: !=, neq, 키워드 gt, gte, lt, lte, ilike. 모르는 조건은 정확 일치가 되고, v3 는 ... is not a search condition, so it searches by equality 경고를 냅니다.
  • @search 가 없으면 @expose 엔티티의 문자열 필드는 auto, 날짜·시간 필드는 between, 나머지는 eq 입니다.
  • LocalDate 의 between 은 To 에 하루를 더해 마지막 날까지 포함합니다.

isnull - 값이 비어 있는가​

Loan:
fields:
returnedDate: date @readonly @search(isnull) -- returned on, empty until returned
요청의 returnedDateEmpty조건
보내지 않음, 또는 null없음
trueIS NULL - 아직 반납하지 않은 대출
falseIS NOT NULL

필드 하나에 조건 하나입니다: isnull 필드에는 From/To 가 생기지 않습니다. @ref(order.shippedDate) 와 쓰면 관계 너머의 컬럼을 검사합니다. 2.x 생성기와 jpa-springboot 출력은 isnull 을 모르는 조건(정확 일치)으로 다룹니다.

목록 필드​

drivers: List<RentDriver> @search(eq) 는 driversItem 과 조인(root.join("drivers"))을 만들고, 목록 필드의 @search(in) 도 조인합니다.

참조 너머​

companyName: string @search(like) @ref(company.name)    # r.get("company").get("name")

기본 정렬: @sort​

entity:
Product:
meta: entity @root @expose(20) @sort(name+)
PurchaseOrder:
meta: entity @root @expose(20) @sort(orderDate-, orderId-)

요청이 sortCode 를 보내지 않을 때의 순서입니다 - 엔티티에 적으면 그 엔티티의 모든 검색 DTO 에, 검색 DTO 에 적으면 그 DTO 에만(검색 DTO 쪽이 우선). 요청의 sortCode 가 늘 이깁니다. 생성: @Builder.Default private String sortCode="name+";. @sort 가 없으면 정렬 없이 조회합니다.

코드에서 검색하기​

생성 코드는 검색 DTO 를 Specification 으로 바꿉니다. 직접 쓰는 코드에서는 Q 클래스로 실행 시 조건을 만들고, DSL 에 없는 연산자도 씁니다:

Specification<VendorInfo> spec = Q.VendorInfo.vendorName(Op.ILIKE, "acme");
// WHERE LOWER(vendor_name) LIKE LOWER('%acme%')

Op: EQ, NEQ, LIKE(대소문자 구분), ILIKE, NOT_LIKE, STARTS_WITH, ENDS_WITH, NOT_ILIKE, ISTARTS_WITH, IENDS_WITH, IEQ, GT, GTE, LT, LTE, IN, NOT_IN, IS_NULL, IS_NOT_NULL, BETWEEN. 같은 Q 메타로 조인·일괄 수정·삭제를 만드는 JoinSpec, UpdateSpec, DeleteSpec 은 blueprint/elasticore-dev-guide.md 에 있습니다.