Как создать пользовательскую функцию 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 при запуске через специальный модуль. Реализация будет заключать в себе методы, которые создают новые соединения, добавляя пользовательскую функцию к каждому из них.