Вы ищете простой способ динамической фильтрации объектов? Не ищите ничего, кроме Spring Filter. Благодаря 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 или км < 50 000) и цвет : «белый» и поле «Аварии» пусто.
/* 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 );
}
Репозиторий должен реализовать JpaSpecificationExecutor
для выполнения спецификации Spring. 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» |
или | или два выражения | значение ~ '*привет*' или имя ~ '*мир*' |
нет | не это выражение | нет (id > 100 или Category.order имеет значение null) |
Буквальный | Описание | Пример |
---|---|---|
~ | проверяет, похоже ли левое (строковое) выражение на правое (строковое) выражение | имя_каталога ~ '*электронный*' |
~~ | аналогичен предыдущему оператору, но нечувствителен к регистру | имя_каталога ~~ 'ЭлектроНик*' |
: | проверяет, равно ли левое выражение правому выражению | идентификатор : 5 |
! | проверяет, не равно ли левое выражение правому выражению | имя пользователя ! 'торшид' |
> | проверяет, больше ли левое выражение, чем правое выражение | расстояние > 100 |
>: | проверяет, больше или равно ли левое выражение правому выражению | расстояние >: 100 |
< | проверяет, меньше ли левое выражение, чем правое выражение | расстояние < 100 |
<: | проверяет, меньше ли левое выражение или равно правому выражению | расстояние <: 100 |
является нулевым | проверяет, является ли выражение нулевым | статус нулевой |
не является нулевым | проверяет, не является ли выражение нулевым | статус не нулевой |
пусто | проверяет, пусто ли выражение (коллекции) | дети пусты |
не пусто | проверяет, не пусто ли выражение (коллекции) | дети не пустые |
в | проверяет, присутствует ли выражение в правильных выражениях | статус в [ 'инициализировано' , 'активно' ] |
не в | проверяет, отсутствует ли выражение в правильных выражениях | статус не в [ 'не удалось' , 'закрыто' ] |
Имя | Описание | Пример |
---|---|---|
размер | возвращает размер коллекции | размер( авария ) |
Идеи и запросы всегда приветствуются. Для форматирования используется стиль Java Google.
Распространяется по лицензии MIT.