首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将预取添加到NamedQuery/MappedSelect中?

如何将预取添加到NamedQuery/MappedSelect中?
EN

Stack Overflow用户
提问于 2018-02-07 22:53:23
回答 1查看 115关注 0票数 0

我的模型中有一个命名查询,它被设置为获取数据对象。

代码语言:javascript
复制
<query name="artists" type="SQLTemplate" root="obj-entity" root-name="Artist">
    <property name="cayenne.GenericSelectQuery.fetchingDataRows" value="false"/>
    <sql><![CDATA[SELECT * FROM Artist]]></sql>
</query>

我的实际查询更复杂,无法使用ObjectSelect完成。

我想添加一个预取,但我还没有想出一个我喜欢的解决方案。以下是我尝试过的:

  1. 断陷 列表艺术家=MappedSelect.query(.).select(上下文);artists.forEach(艺术家-> artist.getPaintings.size() ); 这不需要从数据库中刷新,需要为每个艺术家提供一个单独的查询。
  2. 直接调用RelationshipQuery 列表艺术家=MappedSelect.query(.).select(上下文);for (艺术家:艺术家){ Query =新RelationshipQuery(artist.getObjectId(),Artist.PAINTINGS.getName());((ToManyList) artist.getObjectId} 我不认为这做了它应该做的一切,它仍然需要对每个艺术家单独的查询。
  3. 子类MappedSelect公开getReplacementQuery 类MySelect扩展MappedSelect { ..。公共query.getReplacementQuery(context.getEntityResolver());template.addPrefetch(Artist.PAINTINGS.disjointById());template.setCacheStrategy(QueryCacheStrategy.NO_CACHE);SQLTemplate getReplacementQuery(.){返回( SQLTemplate ) super.getReplacementQuery(.);} MySelect查询=新MySelect(.);SQLTemplate模板=query.select列表艺术家=query.select(上下文); 我不喜欢访问私有API。我还认为,如果在访问替换查询后设置了任何参数,则此解决方案可能会失败。
  4. 更改包以访问BaseMetadata 包装org.apache.cayenne.query;metaData.mergePrefetch(Artist.PAINTINGS.disjointById());metaData.setCacheStrategy(QueryCacheStrategy.NO_CACHE);MappedSelect Query=MappedSelect.query(.);BaseQueryMetadata metaData = (BaseQueryMetadata) query.getMetaData(); 这似乎稍微好一些,但我仍然在访问私有API,它需要在不同的包中编写代码(或者使用反射)。它也仍然有一种被迫的沮丧情绪。
  5. 重取对象 列表艺术家=MappedSelect.query(.).select(上下文);ObjectSelect.query(Artist.class) Artist.PAINTINGS.disjoint.prefetch(Artist.PAINTINGS.disjoint() .cacheStrategy(QueryCacheStrategy.NO_CACHE);.select(context); 这就是我试图避免的,因为我正在重新获取我刚刚检索到的行。

是否有一种向命名查询添加预取的首选方法,比如我可以在模型中设置的属性?还是有一个很好的方法来恢复一段关系?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-08 05:56:57

MappedSelectSQLSelect都不支持预取,这是一个不幸的遗漏(我将继续在卡宴填补这一空白)。您可能必须切换到较旧的、不太漂亮但完全实用的SQLTemplate查询,该查询可以:

代码语言:javascript
复制
SQLTemplate q = new SQLTemplate(MyEntity.class, "SELECT * FROM...");
q.addPrefetch(MyEntity.SOME_RELATIONSHIP.getName());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48674666

复制
相关文章

相似问题

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