如何创建自定义 SQLite 函数并在 Cayenne 下执行
How to create custom SQLite function and execute under Cayenne
我正在尝试使用 Apache Cayenne 的 performQuery()
编写一个带有两个参数和 运行 的自定义 SQLite 函数,它看起来像:
String query = "SELECT * FROM TABLE WHERE MYFUNC(arg1, arg2) <= SOME_VALUE"
ObjectContext ctx = ...
ctx.performQuery(query)
我尝试使用 org.sqlite.Function.create()
,但它失败了,因为我的连接被 Cayenne 包裹了。
我的理解是,无论您使用什么方法注册函数,它都只会发生在单个连接上。在 Cayenne 中,您通常使用具有多个连接的连接池。此外,这些可以对应用程序的其余部分透明地关闭和重新打开。你需要考虑到这一点。
换句话说,您需要确保池中的每个连接都注册了此函数。一种快速而肮脏的方法可能是将池限制为仅一个连接。更高级、更简洁的解决方案是实现您自己的 DataSourceFactory and load it into Cayenne runtime on startup via a custom module。一个实现将包装创建新连接的方法,为每个方法添加自定义函数。
我正在尝试使用 Apache Cayenne 的 performQuery()
编写一个带有两个参数和 运行 的自定义 SQLite 函数,它看起来像:
String query = "SELECT * FROM TABLE WHERE MYFUNC(arg1, arg2) <= SOME_VALUE"
ObjectContext ctx = ...
ctx.performQuery(query)
我尝试使用 org.sqlite.Function.create()
,但它失败了,因为我的连接被 Cayenne 包裹了。
我的理解是,无论您使用什么方法注册函数,它都只会发生在单个连接上。在 Cayenne 中,您通常使用具有多个连接的连接池。此外,这些可以对应用程序的其余部分透明地关闭和重新打开。你需要考虑到这一点。
换句话说,您需要确保池中的每个连接都注册了此函数。一种快速而肮脏的方法可能是将池限制为仅一个连接。更高级、更简洁的解决方案是实现您自己的 DataSourceFactory and load it into Cayenne runtime on startup via a custom module。一个实现将包装创建新连接的方法,为每个方法添加自定义函数。