在我的API中,目前可以过滤数据库中存在的所有字段。
过滤在API项目的FilterUtils.java中实现。这会将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
。
有什么想法吗?感谢所有帮助。
答案 0 :(得分:0)
最好的办法是将过滤器密钥拆分为持久性和非持久性属性。然后你将构建2个表达式,每个表达一个键的子集。使用第一个表达式构建一个从DB获取的查询,第二个表达式 - 在内存中过滤返回的结果:
Expression p = ...
Expression np = ...
SelectQuery query = new SelectQuery(Document.class, p);
List<Document> docs = context.performQuery(query);
List<Document> filteredDocs = np.filterObjects(p);