首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache-Cayenne自定义查询结果

Apache-Cayenne自定义查询结果
EN

Stack Overflow用户
提问于 2019-12-05 18:45:25
回答 1查看 190关注 0票数 0

为了回答我的问题,我在学校做一个以前在过去学期里做过的项目。因此,在设计和开发中做出的选择是我不能百分之百肯定的事情,所以我不能评论为什么事情是这样设置的背后的理由。我还查看了Apache标记上的所有问题,但找不到解决这一问题的方法。如果我弄错了,请告诉我,我很乐意检查一下。

本质上,我们有一个有大量列的表,我只希望加载其中的几个列(否则会有太多不必要的数据被查询,而且加载页面需要更长的时间)。

作为一个示例,为了保持它的通用性,假设我有一个具有10列的对象的表。我只想要三列。因此,在我的代码中,我会这样做:

代码语言:javascript
复制
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;
}

当我运行它时,它工作并返回适当的行数。但是,当我尝试与数据交互和检索数据时,它将在包含所有列的每一行上运行单独的查询。

因此,举个例子,如果在页面上得到了我会得到的结果:

代码语言:javascript
复制
object.getColumn1();

它将对所有列的对象运行一个查询.为什么会发生这种情况,有没有办法完成我想要做的事情?

非常感谢,-R

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-10 11:49:46

在卡宴,你不能获取一个部分对象。或者更确切地说,只要ID列存在,就可以获取它,但是对象将处于“空心”状态。然后,每当您尝试读取这类对象的属性时,它将从DB (您所观察到的正是如此)被懒散地解析出来。部分对象获取特性是最近被要求的,因此这种情况可能很快就会改变。

现在您有两个选择:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59201482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档