当我使用多个关系路径时,Ebean 查询运算符“Fetch”不起作用
Posted
技术标签:
【中文标题】当我使用多个关系路径时,Ebean 查询运算符“Fetch”不起作用【英文标题】:Ebean query operator "Fetch" isn't working when I use more than one relationship path 【发布时间】:2018-08-16 17:23:56 【问题描述】:据我了解,当我在查询对象时使用fetch
时,Ebean 将尝试使用连接来获取关系。
例如
Ebean.find(ProjectRequest.class)
.fetch("attachments")
.findList();
这在尝试获取一个关系时按预期工作。
但是当我尝试fetch
多个关系时,它不会通过连接查询任何关系,而是通过单独的查询获取所有关系。
例如
Ebean.find(ProjectRequest.class)
.fetch("projectConstructionCosts")
.fetch("attachments")
.fetch("projectRequestComments")
.fetch("additionalContacts")
.where()
.in("project_status", projectStatusValues)
.findList();
根据本文档页面中的代码示例,我应该能够做到这一点。 https://ebean-orm.github.io/apidoc/10/io/ebean/FetchConfig.html
【问题讨论】:
【参考方案1】:我使用“*”作为 fetchProperties 并为我工作
Ebean.find(ProjectRequest.class)
.fetch("projectConstructionCosts", "*")
.fetch("attachments", "*")
.fetch("projectRequestComments", "*")
.fetch("additionalContacts", "*")
.where()
.in("project_status", projectStatusValues)
.findList();
【讨论】:
【参考方案2】:它不通过连接查询任何关系,而是通过单独的查询获取所有关系
Ebean 不使用 SQL 连接而是创建额外的单独查询来加载这些关联的原因是因为关系是 ToMany
关系,并且 Ebean 永远不会生成 SQL 笛卡尔积(因为它被认为太冒险/昂贵)。
也就是说,Ebean 将只允许 ToMany
关系中的 1 个包含在“根查询”中(以避免 sql cartiesian 积),然后将其他关系作为“辅助查询”加载。
另外请注意,如果查询包含max rows
限制,那么 Ebean 将在生成的 SQL 中遵守这一点。在这种情况下,Ebean 不能包含到 ToMany
的 SQL 连接,这将成为“辅助查询”(不是根 SQL 查询的一部分)。
参考:https://ebean-orm.github.io/docs/query/fetch
【讨论】:
以上是关于当我使用多个关系路径时,Ebean 查询运算符“Fetch”不起作用的主要内容,如果未能解决你的问题,请参考以下文章