当我使用多个关系路径时,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”不起作用的主要内容,如果未能解决你的问题,请参考以下文章

连接查询

在我的 Play 应用程序中使用 Ebean/JPA,如何删除 OneToOne 关系中的对象?

连接查询,变量,运算符,语句

连接查询

连接查询

MySQL8:连接查询