Apache-Cayenne 自定义查询结果

Apache-Cayenne Custom Query Results

作为我的问题的序言,我在学校从事一个项目,该项目以前在过去的学期中从事过。所以在设计和开发中做出的选择是我不是 100% 确定的,所以我不能评论为什么事情是这样设置的背后的原因。我还查看了 Apache-Cayenne 标签上的所有问题,但找不到解决此问题的内容。如果我弄错了,请告诉我,我很乐意查看。

本质上,我们有一个包含过多列的 table,我只想加载其中的一些列(否则查询的不必要数据太多,并且需要页面加载时间更长)。

作为保持通用性的示例,假设我有一个 table 对象,它有 10 列。我只想要 3 列。所以在我的代码中我会有这个:

public List<objectToQuery> getSpecificColumns() {

ObjectContext context = getNewContext();

SQLTemplate select = new SQLTemplate(objectToQuery.class, "select column1, column2, column3 from table");

List<objectToQuery> results = context.performQuery(select);

return results;
}

当我 运行 这个时,它起作用了,returns 适当的行数。但是,当我尝试与数据交互并检索数据时,它会 运行 对包含所有列的每一行进行单独查询。

例如,如果在获得结果的页面上,我会有:

object.getColumn1();

它将 运行 对所有列的对象进行查询...为什么会发生这种情况,有什么方法可以完成我正在尝试做的事情吗?

非常感谢, -R

在 Cayenne 中,您无法获取部分对象。或者更确切地说,只要它的 ID 列存在,您就可以获取它,但该对象将处于 "hollow" 状态。然后,每当您尝试读取此类对象的 属性 时,它将从 DB 中延迟解析(正是您所观察到的)。部分对象提取功能 was requested recently,因此这可能很快就会改变。

现在你有两个选择:

  • 使用完整对象(通过 ObjectSelect 查询而不是 SQLTemplate 假设您使用的是 4.0 或更新版本),因为您通常不关心微优化。
  • 使用列 select (ObjectSelect.columnQuery(..)),这将产生一个对象列表 [] 的结果,其中每个数组包含单个 DB 行的指定列的值。

在前一种情况下,您保留了对象模型,牺牲了一些额外的内存(可能还有获取速度),在后一种情况下,您优化了查询,但使用的是原始数据。毕竟编程往往是权衡取舍:)