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 行的指定列的值。
在前一种情况下,您保留了对象模型,牺牲了一些额外的内存(可能还有获取速度),在后一种情况下,您优化了查询,但使用的是原始数据。毕竟编程往往是权衡取舍:)
作为我的问题的序言,我在学校从事一个项目,该项目以前在过去的学期中从事过。所以在设计和开发中做出的选择是我不是 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 行的指定列的值。
在前一种情况下,您保留了对象模型,牺牲了一些额外的内存(可能还有获取速度),在后一种情况下,您优化了查询,但使用的是原始数据。毕竟编程往往是权衡取舍:)