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 自定义查询结果的主要内容,如果未能解决你的问题,请参考以下文章

自定义 wordpress 元查询(无结果)

MySQL可以查询自定义字段

SQL Server 在查询结果增加自定义的三个字段?如何搞?

Spring Data JPA 查询结果返回至自定义实体

SOLR查询过滤结果中的自定义排序?

django rest框架列表查询自定义json数组结果响应,因为日期格式