加入spring数据查询存储库

Posted

技术标签:

【中文标题】加入spring数据查询存储库【英文标题】:join in spring data query repository 【发布时间】:2021-11-11 09:43:10 【问题描述】:
@Query("select u from User u join u.favoriteRestos s where u.id = ?1 ")
User findByIdWithFavoriteRestos (Long userId);

O 在我的仓库中有这个查询,但不是返回一个带有空的 favoriteRestos 集合的用户而是返回一个空用户

也返回一个空用户:

@Query("select u from User u join fetch u.favoriteRestos s where u.id = ?1 ")
User findByIdWithFavoriteRestos (Long userId);

我也试过了:

@Query("select u from User u left join u.favoriteRestos s where u.id = ?1 ")
User findByIdWithFavoriteRestos (Long userId);

【问题讨论】:

您可能需要左连接,否则如果没有最喜欢的restos,则连接不会产生任何结果。 最可能的解释是您输入的id 值与底层数据库表中的任何记录都不匹配。检查您的数据。 @Thomas 对于 SQL 是正确的,对于 Hibernate 不是正确的。在 HQL 中,即使 favoriteRestos 集合为空,关联的用户实体仍应返回 AFAIK。 如果要初始化集合,应该是join fetch 而不是join?见thorben-janssen.com/… @TimBiegeleisen 确切地说...... OP 的查询和描述看起来像实际目标是获取集合,即获取 ID 为 x 的用户并急切地加载那里的任何 favoriteRestos。因此,不只是JOIN 会影响结果集,而应该是JOIN FETCH,它不会影响结果集。 【参考方案1】:

它没有找到任何用户,因为join 是一个内连接。需要添加left关键字:

@Query("select u from User u left join fetch u.favoriteRestos s where u.id = ?1 ")
User findByIdWithFavoriteRestos (Long userId);

P.S.:fetch 如果要填充集合,如果您有默认(惰性)多对多映射,则也需要。

【讨论】:

以上是关于加入spring数据查询存储库的主要内容,如果未能解决你的问题,请参考以下文章

Spring 数据存储库和 DAO Java 泛型

具有几何返回类型的 Spring 数据存储库和本机查询

如何在服务类中隐藏spring数据存储库功能?

Spring Boot JPA 存储库查询

自定义 MongoDB Spring 数据存储库

存储库查询的 Spring Security 授权