Apache-Cayenne 自定义查询结果
Posted
技术标签:
【中文标题】Apache-Cayenne 自定义查询结果【英文标题】:Apache-Cayenne Custom Query Results 【发布时间】:2019-12-05 18:45:25 【问题描述】:作为我的问题的序言,我正在学校从事一个以前在过去几个学期进行过的项目。所以在设计和开发中做出的选择是我不能 100% 确定的,所以我不能评论为什么事情是这样设置的背后的原因。我还查看了有关 Apache-Cayenne 标签的所有问题,但找不到可以解决此问题的内容。如果我弄错了,请告诉我,我很乐意检查一下。
本质上,我们有一个包含过多列的表,我只希望加载其中的一些列(否则会查询太多不必要的数据,并且加载页面需要更长的时间)。
作为保持其通用性的示例,假设我有一个包含 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;
当我运行它时,它会工作并返回适当数量的行。但是,当我尝试与数据交互和检索数据时,它将在包含所有列的每一行上运行单独的查询。
例如,如果在获得结果的页面上,我会:
object.getColumn1();
它将对所有列的对象运行查询...为什么会发生这种情况,有什么方法可以完成我想要做的事情吗?
非常感谢, -R
【问题讨论】:
【参考方案1】:在 Cayenne 中,您无法获取部分对象。或者更确切地说,只要它的 ID 列存在,您就可以获取它,但该对象将处于“空心”状态。然后,每当您尝试读取此类对象的属性时,它将从 DB 中延迟解析(正是您所观察到的)。部分对象获取功能was requested recently,所以这可能很快就会改变。
现在你有两个选择:
使用完整对象(通过 ObjectSelect 查询而不是 SQLTemplate,假设您使用的是 4.0 或更高版本),因为您通常不关心微优化。 使用列选择 (ObjectSelect.columnQuery(..)
),这将产生一个 Object[] 列表,其中每个数组包含单个 DB 行的指定列的值。
在前一种情况下,您保留对象模型会牺牲一些额外的内存(可能还有获取速度),在后一种情况下 - 您优化查询,但使用原始数据。毕竟,编程通常是关于权衡的:)
【讨论】:
非常感谢您的有益回复。我以为是这种情况,但想确定一下。我们决定重构我们的数据库表,使其对 Cayenne 查询更加友好。我尝试使用 columnQuery 但在尝试通过 html / javascript 访问对象的其他部分而不引用实际对象时证明是困难的哈哈。感谢您的宝贵时间!以上是关于Apache-Cayenne 自定义查询结果的主要内容,如果未能解决你的问题,请参考以下文章