Как создать пользовательскую функцию SQLite и выполнить под Cayenne

Я пытаюсь написать пользовательскую функцию SQLite, которая принимает два аргумента и работает с Apache Cayenne's performQuery() который выглядит примерно так:

String query = "SELECT * FROM TABLE WHERE MYFUNC(arg1, arg2) <= SOME_VALUE"

ObjectContext ctx = ...
ctx.performQuery(query)

Я пытался с помощью org.sqlite.Function.create(), но это не удалось, так как мое соединение обернуто Cayenne.

1 ответ

Решение

Насколько я понимаю, какой бы метод вы ни использовали для регистрации функции, это происходит только для одного соединения. В Cayenne вы обычно работаете с пулом соединений с несколькими соединениями. Более того, они могут быть закрыты и снова открыты для остальных приложений. Вы должны принять это во внимание.

Другими словами, вам нужно убедиться, что каждое соединение в пуле регистрирует эту функцию. Быстрый и грязный способ может заключаться в том, чтобы ограничить пул только одним соединением. Более совершенное и более чистое решение состоит в том, чтобы реализовать собственный DataSourceFactory и загрузить его в среду выполнения Cayenne при запуске через специальный модуль. Реализация будет заключать в себе методы, которые создают новые соединения, добавляя пользовательскую функцию к каждому из них.

Другие вопросы по тегам