검색과 정렬
@expose 엔티티는 모두 검색 DTO(XxxSrchDTO)와 POST /api/<도메인>/<엔티티>/search 를 받습니다. 필드의
@search(조건) 이 그 필드를 어떻게 검색할지 정합니다(@s, @srch, @filter 도 같음). 쉼표 뒤의 두 번째 값은
엔티티 필드 이름입니다(@search(like,comName)).
{ "name": "fish", "pageNumber": 0, "pageSize": 20, "sortCode": "name+" }
답은 페이지입니다: content, totalElements, totalPages, number. pageNumber 는 0 부터 셉니다.
조건
| DSL | Criteria | 대소문자 무시 | 뜻 |
|---|---|---|---|
eq, = | equal | 아니오 | 정확 일치 |
like | like (%v%) | v3: 예 / 2.x 호환: 아니오 | 값의 일부 |
%_%, %% | like (%v%) | 아니오 | 값의 일부, 대소문자 구분 - 모든 모드 |
%__% | like (%v%) | 예 | 값의 일부, 대소문자 무시 |
__=, =__ | equal | 예 | 정확 일치, 대소문자 무시 |
_% / %_ | like (v% / %v) | 아니오 | 접두사 / 접미사 |
__% / %__ | like | 예 | 접두사 / 접미사, 대소문자 무시 |
>, >=, <, <= | 비교 | 아니오 | |
in | .in() | 아니오 | 여러 값 중 하나 (status: List<Status> @search(in)) |
between, ~ | between | 아니오 | <필드>From 과 <필드>To |
isnull | isNull / isNotNull | 아니오 | 비어 있는지: 검색 속성 <필드>Empty: Boolean (v3 번들) |
auto (@search 만) | 실행 시 결정 | 아니오 | 문자열 전용: 값이 % 로 시작하거나 끝나면 like, 아니면 eq |
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 | 없음 |
true | IS NULL - 아직 반납하지 않은 대출 |
false | IS 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 에 있습니다.