我正在使用 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,则会延迟加载数据。但这不是我的目标,因为它会导致糟糕的表现。
编辑:所以我的问题是,如何执行一个查询,其中获取所有数据并且满足指定条件的所有帖子在我的结果集中仅出现一次。
Edit:
示例对象是:
[{
"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>
...
]
Edit:
事实证明,子查询与“不同”是冲突的。如果我从查询中删除它们,我会得到不同的帖子。
如果我编辑本机 sql 查询并将“distinct”更改为“distinct on”,它就可以工作。但我认为休眠中不存在“distinct on”子句。那么有什么好的想法可以做什么吗?
我将不胜感激任何帮助 :)