엔터티를 동적으로 필터링하는 간편한 방법을 찾고 계십니까? 스프링 필터보다 더 이상 보지 마십시오. Spring Filter를 사용하면 API가 포괄적인 검색 기능의 이점을 누릴 수 있습니다. 웹 API가 없더라도 강력한 필터 빌더를 활용하여 복잡한 SQL 또는 Mongo 쿼리를 생성할 수 있습니다.
라이브러리의 모듈식 디자인과 Spring과의 원활한 통합을 통해 사용자 정의 연산자 및 기능으로 쉽게 확장하거나 다른 플랫폼에 통합할 수도 있습니다. 프로세스를 단순화하기 위해 JavaScript 필터 빌더도 사용할 수 있으므로 프런트엔드 애플리케이션에서 유효한 쿼리를 생성하는 골치 아픈 작업에 작별을 고하세요.
Spring Filter 3.0.0은 처음부터 새로 구축된 릴리스입니다. 여기에는 많은 새로운 기능, 개선 사항 및 버그 수정과 함께 Spring과의 훨씬 더 나은 통합이 포함됩니다. 언어 구문은 변경되지 않았으므로 프런트엔드 애플리케이션에는 수정이 필요하지 않습니다. 새로운
FilterBuilder
클래스는 이전 클래스와 호환되지 않으며 기타 주요 변경 사항이 있지만 라이브러리의 기본 사용법은 유사하게 유지됩니다. 잘못된 점을 발견하면 자유롭게 이슈를 만들어주세요. 우리를 후원하여 프로젝트를 지원해 보세요.
2.xx 브랜치에서 이전 버전에 액세스할 수 있습니다.
/search?filter= 평균 (등급) > 4.5 및 ['audi', 'land rover'] 의 브랜드 이름 및 (연도 > 2018 또는 km < 50000) 및 색상 : '흰색' 및 사고가 비어 있음
/* Entity used in the query above */
@ Entity public class Car {
@ Id long id ;
int year ;
int km ;
@ Enumerated Color color ;
@ ManyToOne Brand brand ;
@ OneToMany List < Accident > accidents ;
@ ElementCollection List < Integer > ratings ;
// ...
}
예, 부울, 날짜, 열거형, 함수, 심지어 관계까지 지원합니다! 다른 것이 필요하신가요? 여기에 알려주십시오.
우리 프로젝트를 후원하고 즉각적인 해결을 위해 문제의 우선순위를 정하는 이점을 얻으십시오.
< dependency >
< groupId >com.turkraft.springfilter</ groupId >
< artifactId >jpa</ artifactId >
< version >3.1.7</ version >
</ dependency >
@ GetMapping ( value = "/search" )
Page < Entity > search ( @ Filter Specification < Entity > spec , Pageable page ) {
return repository . findAll ( spec , page );
}
저장소는 Spring의 사양을 실행하기 위해 JpaSpecificationExecutor
구현해야 하며 SimpleJpaRepository
잘 알려진 구현입니다. 페이지 매김 및 정렬이 필요하지 않은 경우 Pageable
인수를 제거하고 List
반환할 수 있습니다.
< dependency >
< groupId >com.turkraft.springfilter</ groupId >
< artifactId >mongo</ artifactId >
< version >3.1.7</ version >
</ dependency >
@ GetMapping ( value = "/search" )
Page < Entity > search ( @ Filter ( entityClass = Entity . class ) Query query , Pageable page ) {
return mongoTemplate . find ( query . with ( pageable ), Entity . class );
}
public interface EntityRepository extends MongoRepository < Entity , String > {
@ Query ( "?0" )
List < Employee > findAll ( Document document );
@ Query ( "?0" )
Page < Employee > findAll ( Document document , Pageable pageable );
}
@ GetMapping ( value = "/search" )
Page < Entity > search ( @ Filter ( entityClass = Entity . class ) Document document , Pageable page ) {
return entityRepository . findAll ( query , page );
}
< dependency >
< groupId >com.turkraft.springfilter</ groupId >
< artifactId >core</ artifactId >
< version >3.1.7</ version >
</ dependency >
@ Autowired FilterBuilder fb ;
FilterNode filter = fb . field ( "year" ). equal ( fb . input ( 2023 )). and ( fb . isNull ( fb . field ( "category" ))). get ();
@ Autowired ConversionService cs ;
String query = cs . convert ( filter , String . class ); // year : 2023 and category is null
객체를 문자열로 또는 그 반대로 변환할 때 Spring의 ConversionService
내부적으로 사용된다는 점에 유의하세요. Spring Filter는 날짜 및 기타 유형에 대한 패턴을 적용하지 않습니다. 필요한 경우 사용자 정의는 Spring 내에서 직접 수행되어야 합니다.
프런트엔드 애플리케이션에서 문자열 쿼리를 수동으로 작성하는 대신 JavaScript 쿼리 빌더를 사용할 수 있습니다.
import { sfAnd , sfEqual , sfGt , sfIsNull , sfLike , sfNot , sfOr } from 'spring-filter-query-builder' ;
const filter = sfAnd ( [
sfAnd ( [ sfEqual ( 'status' , 'active' ) , sfGt ( 'createdAt' , '1-1-2000' ) ] ) ,
sfOr ( [ sfLike ( 'value' , '*hello*' ) , sfLike ( 'name' , '*world*' ) ] ) ,
sfNot ( sfOr ( [ sfGt ( 'id' , 100 ) , sfIsNull ( 'category.order' ) ] ) ) ,
] ) ;
const req = await fetch ( 'http://api/person?filter=' + filter . toString ( ) ) ;
설명서를 참조하세요.
field
, field.nestedField
123
, -321.123
, true
, false
, 'hello world'
, 'escape ' quote'
, '1-01-2023'
[1, 2, 3]
, [field, ['x', 'y'], 99]
f()
, f(x)
, f(x, y)
`place_holder`
x and (y or z)
op expr
, not ready
expr op expr
, x and y
expr op
, field is null
아래에는 모든 통합(JPA 및 Mongo)에서 지원되는 연산자 및 기능이 나열되어 있습니다. 통합은 이 공통 언어를 확장할 수 있습니다.
오자 | 설명 | 예 |
---|---|---|
그리고 | 그리고 두 가지 표현 | 상태 : '활성' 및 생성된 위치 > '1-1-2000' |
또는 | 또는 두 가지 표현 | 값 ~ '*hello*' 또는 이름 ~ '*world*' |
~ 아니다 | 표현이 아니야 | 아님 (id > 100 또는 Category.order가 null임) |
오자 | 설명 | 예 |
---|---|---|
~ | 왼쪽(문자열) 표현식이 오른쪽(문자열) 표현식과 유사한지 확인합니다. | 카탈로그.이름 ~ '*전자*' |
~~ | 이전 연산자와 유사하지만 대소문자를 구분하지 않습니다. | Catalog.name ~~ 'ElEcTroNic*' |
: | 왼쪽 표현식이 오른쪽 표현식과 같은지 확인합니다. | 아이디 : 5 |
! | 왼쪽 표현식이 오른쪽 표현식과 같지 않은지 확인합니다. | 사용자 이름 ! '토르시드' |
> | 왼쪽 표현식이 오른쪽 표현식보다 큰지 확인합니다. | 거리 > 100 |
>: | 왼쪽 표현식이 오른쪽 표현식보다 크거나 같은지 확인합니다. | 거리 >: 100 |
< | 왼쪽 표현식이 오른쪽 표현식보다 작은지 확인합니다. | 거리 < 100 |
<: | 왼쪽 표현식이 오른쪽 표현식보다 작거나 같은지 확인합니다. | 거리 <: 100 |
null입니다 | 표현식이 null인지 확인합니다. | 상태가 null입니다. |
null이 아닙니다 | 표현식이 null이 아닌지 확인합니다. | 상태가 null이 아닙니다 |
비어있다 | (컬렉션) 표현식이 비어 있는지 확인합니다. | 아이들 은 비어있다 |
비어 있지 않습니다 | (컬렉션) 표현식이 비어 있지 않은지 확인합니다. | 아이들은 비어 있지 않습니다 |
~에 | 표현식이 올바른 표현식에 있는지 확인합니다. | [ '초기화됨' , '활성' ] 상태 |
안에는 없어 | 표현식이 올바른 표현식에 존재하지 않는지 확인합니다. | 상태가 [ '실패' , '닫힘' ] 에 없음 |
이름 | 설명 | 예 |
---|---|---|
크기 | 컬렉션의 크기를 반환합니다. | 크기( 사고 ) |
아이디어와 끌어오기 요청은 언제나 환영합니다. 형식 지정에는 Google의 Java 스타일이 사용됩니다.
MIT 라이센스에 따라 배포됩니다.