4.5.16. Поиск сущностей с фильтром
REST API даёт возможность искать экземпляры сущностей по определенным условиям.
Примеры мы рассмотрим на модели данных, состоящей из двух сущностей:
-
Author с двумя полями:
lastName
иfirstName
-
Book с тремя полями:
title
(String),author
(Author) иpublicationYear
(Integer)
Чтобы выполнить поиск с фильтром URL должен выглядеть следующим образом:
http://localhost:8080/app/rest/v2/entities/test$Book/search
Условия поиска должны быть переданы в параметре filter
. filter
- это JSON объект, который содержит набор условий поиска. Если поиск выполняется с помощью GET запроса, то параметр filter
передается в URL.
- Пример 1
-
Необходимо найти все книги, опубликованные в 2007 году с именем автора, начинающимся с "Alex". JSON фильтр для подобного условия будет выглядеть так:
{
"conditions": [
{
"property": "author.firstName",
"operator": "startsWith",
"value": "Alex"
},
{
"property": "publicationDate",
"operator": "=",
"value": 2007
}
]
}
По умолчанию все критерии поиска применяются с условием И.
Данный пример также демонстрирует возможность использования вложенных свойств объекта (author.firstName
).
- Пример 2
-
Следующий пример показывает две вещи: как выполнять поиск с помощью POST запроса и как использовать группы ИЛИ. В случае POST все параметры должны быть переданы в JSON объекте в теле запроса. Условия поиска должны быть помещены в поле объекта с именем
filter
. Остальные параметры (имя view, количество выгружаемых сущностей и т.п.) должны быть помещены в поля объекта с соответствующими именами:
{
"filter": {
"conditions": [
{
"group": "OR",
"conditions": [
{
"property": "author.lastName",
"operator": "contains",
"value": "Stev"
},
{
"property": "author.lastName",
"operator": "=",
"value": "Dumas"
}
]
},
{
"property": "publicationDate",
"operator": "=",
"in": [2007, 2008]
}
]
},
"view": "book-view"
}
В этом примере коллекция conditions
содержит не только объекты с критериями поиска, но и группу ИЛИ (OR). Итоговое условие можно представить так:
((author.lastName contains Stev) OR (author.lastName = Duma) AND (publicationDate in [2007, 2008]))
Обратите внимание, что параметр view
также передан в теле запроса.