我的模型中有一个命名查询,它被设置为获取数据对象。
<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完成。
我想添加一个预取,但我还没有想出一个我喜欢的解决方案。以下是我尝试过的:
RelationshipQuery
列表艺术家=MappedSelect.query(.).select(上下文);for (艺术家:艺术家){ Query =新RelationshipQuery(artist.getObjectId(),Artist.PAINTINGS.getName());((ToManyList) artist.getObjectId}
我不认为这做了它应该做的一切,它仍然需要对每个艺术家单独的查询。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。我还认为,如果在访问替换查询后设置了任何参数,则此解决方案可能会失败。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,它需要在不同的包中编写代码(或者使用反射)。它也仍然有一种被迫的沮丧情绪。是否有一种向命名查询添加预取的首选方法,比如我可以在模型中设置的属性?还是有一个很好的方法来恢复一段关系?
发布于 2018-02-08 05:56:57
MappedSelect和SQLSelect都不支持预取,这是一个不幸的遗漏(我将继续在卡宴填补这一空白)。您可能必须切换到较旧的、不太漂亮但完全实用的SQLTemplate查询,该查询可以:
SQLTemplate q = new SQLTemplate(MyEntity.class, "SELECT * FROM...");
q.addPrefetch(MyEntity.SOME_RELATIONSHIP.getName());https://stackoverflow.com/questions/48674666
复制相似问题