1

我的数据库模型如下:

A.id (1 : n) B.ad_id

所以在 cayenne 中A a我可以做的对象a.getBArray()是从给定的 A 条目中返回 B 中的所有条目。然而,我想根据 property 过滤这个列表active = 1

显然我可以使用Expression.fromString("active = 1")with SelectQuery,但是对于这种方法,我找不到如何关联要在其上运行此查询的 A 实例。

另一种方法是从代码中检索所有条目a.getBArray()并在代码中过滤,只搜索那些具有 的条目active == true,恕我直言,这种方法效率低下。

建议大多赞赏。

谢谢你,马克西姆。

- 编辑:

我目前的解决方案是(对象名称已分别替换为 a & b):

long aId = DataObjectUtils.longPKForObject(db_a_instance);
String bSQL = "select * from b where active = 1 and a_id = " + aId;
SQLTemplate bQuery = new SQLTemplate(B.class, bSQL);
List<B> dbBs = context.performQuery(bQuery);

我在问是否有更好、更优雅的解决方案?

谢谢。

4

1 回答 1

2

我在 Cayenne 的友好邮件列表上问过类似的问题。你可以在这里看到

似乎首选的方法是通过 Java 中的关系和过滤器,除非关系返回非常大的数据。这样做的好处是完整列表将在内存中,并且下次使用关系时,您无需前往 DB。

这里引用了答案

两者都需要去数据库。

  1. (关系中的遍历方法)需要一次前往数据库以从数据库中对组进行故障排除,但随后它将在内存中。

  2. (使用过滤器方法的查询)每次都需要访问数据库,因此从长远来看,即使它返回的匹配项较少,这也可能会变慢。

如果这是只发生一次的事情并且您真的很关心性能(并且可能有很多组),我会选择#2,否则#1。您也可以稍微优化 #1,因此您不必每次都进行迭代检查。

通过:迈克尔金特里

于 2011-01-24T17:34:34.223 回答