首页 > 解决方案 > Hibernate JOIN FETCH - 对象在结果集中出现多次

问题描述

我正在使用 Spring JPA 和 Hibernate 来构建 REST API。我正在寻找 2 天,但我没有找到解决此问题的任何解决方案。

在某些查询中,我有多个 JOIN FETCH 子句。当我执行查询时,我的结果集中多次出现父对象,实际上就像父亲有孩子一样频繁。
例子:

    @Query("SELECT DISTINCT p AS post," +
        " <some subquery>" +
        "FROM Post p  JOIN FETCH p.user u LEFT JOIN FETCH p.linkedUsers INNER JOIN FETCH p.track track  " 
        "WHERE ( (<some condition>) OR p.user = :me) " +
        "ORDER BY p.created DESC")
List<Object []> getData(@Param("me")User me,
                                 Pageable pageable);

例如,如果我有一个包含 2 个链接用户的帖子,我的帖子将在我的结果集中出现至少 2 次。如果我不执行 JOIN FETCH 或其他 JOIN,则数据会延迟加载。但这不是我的目标,因为它会导致表现不佳。

编辑:所以我的问题是,如何在获取所有数据的情况下执行一个查询,并且所有满足指定条件的帖子在我的结果集中只有一次。

编辑:

示例对象是:

 [{
    "id": 1767,
    "track": {
        "id": 1766,
        "title": "VVS",
        ...
        "streams": [
            {
                "id": 1764,
                 ....
            },
            {
                "id": 1765,
                  ...

            }
        ],
        "isrc": "DEQ021801393"
    },
    "user": {
        "id": 999998,
        "username": "My username",
         ....

    },
    "created": "2018-08-21T22:18:56.451Z",
     ...
    "linked_users": []
},
<this object another time, beacause two stream objects in track>
<many other objects two times>
...
]

编辑:

事实证明,子查询与“不同”相冲突。如果我从查询中删除它们,我会得到不同的帖子。如果我编辑本机 sql 查询并将“distinct”更改为“distinct on”,它就可以工作。但我认为hibernate中不存在“distinct on”子句。那么有什么好主意该怎么做?

我将不胜感激任何帮助 :)

标签: springhibernatejpajoinfetch

解决方案


在 jpa 2.1 中,它支持实体图来解决“重复和 N+1 问题”

@NamedEntityGraph(name = "graph.Order.items", 
               attributeNodes = @NamedAttributeNode(value = "items", subgraph = "items"), 
subgraphs = @NamedSubgraph(name = "items", attributeNodes = @NamedAttributeNode("product")))

使用实体图加载数据:

Map hints = new HashMap();
hints.put("javax.persistence.fetchgraph", graph);

return this.em.find(Order.class, orderId, hints);

更多详情:

https://www.thoughts-on-java.org/jpa-21-entity-graph-part-1-named-entity/


推荐阅读