Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Hibernate JOIN FETCH-对象在Resultset中出现多次_Spring_Hibernate_Jpa_Join_Fetch - Fatal编程技术网

Spring Hibernate JOIN FETCH-对象在Resultset中出现多次

Spring Hibernate JOIN FETCH-对象在Resultset中出现多次,spring,hibernate,jpa,join,fetch,Spring,Hibernate,Jpa,Join,Fetch,我正在使用SpringJPA和Hibernate构建RESTAPI。我搜索了2天,但没有找到解决此问题的任何解决方案 在某些查询中,我有多个JOIN-FETCH子句。当我执行查询时,我的结果集中多次出现父对象,事实上与父对象有子对象的次数相同。 例如: @Query("SELECT DISTINCT p AS post," + " <some subquery>" + "FROM Post p JOIN FETCH p.user u LEFT

我正在使用SpringJPA和Hibernate构建RESTAPI。我搜索了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);
@Query(“选择不同的p作为帖子,”+
" " +
“从Post p JOIN FETCH p.user u LEFT JOIN FETCH p.linkedUsers内部连接FETCH p.track track”
“其中(()或p.user=:me)”+
“由p.C.创建的订单”)
列出getData(@Param(“me”)用户me,
可寻呼(可寻呼);
例如,如果我有一篇有两个链接用户的帖子,我的帖子将在结果集中至少出现两次。 如果我不执行连接获取或其他连接,数据将被延迟加载。但这不是我的目标,因为它会导致糟糕的表现

编辑:所以我的问题是,如何执行一个查询,在这个查询中,所有数据都被提取,所有符合指定条件的帖子在我的结果集中只出现一次

编辑:

示例对象是:

 [{
    "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>
...
]
[{
“id”:1767,
“轨道”:{
“id”:1766,
“标题”:“VVS”,
...
“溪流”:[
{
“id”:1764,
....
},
{
“id”:1765,
...
}
],
“isrc”:“DEQ021801393”
},
“用户”:{
“id”:99998,
“用户名”:“我的用户名”,
....
},
“已创建”:“2018-08-21T22:18:56.451Z”,
...
“链接用户”:[]
},
...
]
编辑:

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


如果有任何帮助,我将不胜感激:)

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

使用实体图加载数据:

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

return this.em.find(Order.class, orderId, hints);
更多详情:


如果有人对我如何解决问题感兴趣:

在忽视这个问题几个星期后,我找到了一个解决办法。我非常确定,使用HQL无法解决这个问题,因此我使用postgreSQLs json_build_object方法编写了一个本机查询。所有数据都在数据库级别生成,并作为JSON对象列表获取。这样做的优点是查询的性能要好得多

查询结构:

SELECT DISTINCT ON(post.created)json(json_build_object('id',...
'user', (SELECT json_build_object('id',... 
            FROM users WHERE users.id = post.user_id)
'track', (SELECT json_build_object('id',....
     'streams',ARRAY(SELECT json_build_object('id'...
FROM
<APPORXIMATELY Same JOINS AS BEFORE>
WHERE
<CONDITIONS>

你的问题到底是什么?如果使用
JOIN FETCH
,则直接加载子对象,这样以后就不必再加载它们了。如果您使用
JOIN
,则正如您所指出的,子对象是延迟加载的。你想达到什么目的?@MichaelAltenburger我想执行一个查询,其中加载了我所有的数据,这意味着有相关孩子的父母。因此,不应再执行select查询。但是如果我执行上面的查询,我的结果集中会多次出现一篇文章。我希望每个帖子在我的结果中都是一次。然后你可以完全删除连接查询,并将帖子中的linkedUsers关系指定为
@OneToMany(mappedBy=“xxx”,fetch=FetchType.EAGER)
。这样,您的查询中应该只包含一次每篇文章,但在执行查询时会立即提取链接用户。@MichaelAltenburger这是一个无向关系,因此不需要mappedBy语句。FetchType.Eager不是很好,因为从那时起,每个关系都会在一个新的sql查询中获取数据。我实现了一个实体图,并对查询进行了注释,但没有帮助。我还有同样的问题。我可以从查询中删除JOIN语句,这样图形就可以工作了,但我的结果集中仍然有重复的对象。还有什么好主意吗?您好,请更新您的代码并展示一些关于“复制对象”的内容。也许我们可以更清楚我更新了我的文字。您可以在上面看到一个示例对象。
SELECT DISTINCT ON(post.created)json(json_build_object('id',...
'user', (SELECT json_build_object('id',... 
            FROM users WHERE users.id = post.user_id)
'track', (SELECT json_build_object('id',....
     'streams',ARRAY(SELECT json_build_object('id'...
FROM
<APPORXIMATELY Same JOINS AS BEFORE>
WHERE
<CONDITIONS>
 List<JsonNode> decoratedPosts = (List<JsonNode>) entityManager
                .createNativeQuery(NativeQueries.getPostsByUser)
                .setParameter("userId", user.getId())
                .setParameter("me", requestor.getId())
                .setParameter("limit", pageable.getPageSize())
                .setParameter("offset", pageable.getOffset())
                .unwrap(org.hibernate.query.NativeQuery.class)
                .addScalar("json", JsonNodeBinaryType.INSTANCE).getResultList();
    <dependency>
        <groupId>com.vladmihalcea</groupId>
        <artifactId>hibernate-types-52</artifactId>
        <version>2.3.4</version>
    </dependency>
public class MariosPostgreSQL94Dialect extends PostgreSQL94Dialect {

public MariosPostgreSQL94Dialect() {
    super();
    this.registerColumnType(Types.OTHER, "json");
}