spring - 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”子句。那么有什么好主意该怎么做?
我将不胜感激任何帮助 :)
解决方案
在 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/
推荐阅读
- c# - 如何将我自己的内容添加到我的 umbraco 页面?
- javascript - 视频轨道没有来自 Navigator.mediaDevices.getSupportedConstraints() 的功能
- jquery - Bootstrap - 无法读取未定义的属性“fn”
- java - Citrus 框架:接收超时时不失败测试
- unity3d - VUFORIA 构建对 Unity 的支持
- android - 如果应用程序从未通过 Play 商店发布,是否需要 android 64 位应用程序版本
- google-apps-script - Google Apps 脚本子字符串
- c++ - 尝试在交叉编译中链接库时出现编译错误
- bioinformatics - 使用snakemake远程前缀时指定源文件
- php - 无法连接:无效设置