Фильтруйте пользовательские поля, отсутствующие в базе данных, используя Apache Cayenne
В моем API в настоящее время можно фильтровать по всем полям, которые существуют в базе данных.
Фильтрация реализована в FilterUtils.java в проекте API. Это преобразует параметры URL в поиск Apache Cayenne и возвращает результат в ресурс.
В проекте "Main" созданы сгенерированные классы для каждой таблицы базы данных в com.foo.bar.auto, которые расширены классами в com.foo.bar. Классы в com.foo.bar могут иметь пользовательские функции. Примером является Document.getAccount.
Document.getAccount предоставляется в API, но он не может отфильтровать его, потому что это не поле базы данных. Мне нужно иметь возможность фильтровать поля как Document.getAccount
,
Можно ли как-то зарегистрировать эти функции в Cayenne?
Синтаксис для поиска по настраиваемым полям должен быть равен синтаксису сегодняшней фильтрации. Поэтому при поиске аккаунта это должно выглядеть так: Document?filter=account(EQ)1234
,
Есть идеи? Вся помощь приветствуется.
1 ответ
Лучше всего разделить ключи фильтра на постоянные и непостоянные свойства. Затем вы должны построить 2 выражения, по одному для каждого набора ключей. Используйте первое выражение для построения запроса на выборку из БД, а второе - для фильтрации возвращаемого результата в памяти:
Expression p = ...
Expression np = ...
SelectQuery query = new SelectQuery(Document.class, p);
List<Document> docs = context.performQuery(query);
List<Document> filteredDocs = np.filterObjects(p);