Фильтруйте пользовательские поля, отсутствующие в базе данных, используя 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);
Другие вопросы по тегам