Java 如何以最小查询数获取所有多对多关系?

Java 如何以最小查询数获取所有多对多关系?,java,hibernate,jpa,spring-boot,spring-data,Java,Hibernate,Jpa,Spring Boot,Spring Data,如何使用最少数量的查询获取所有多对多关系? 我的意思是没有任何n+1查询。 3-这很正常 我有一个实体: @实体 @表(name=“tags”) 公共类标签{ @身份证 @GeneratedValue(策略=GenerationType.AUTO) @列(name=“id”) 私人长id; @列(name=“title”) 私有字符串标题; } @实体 @表(name=“stations”) 公营电台{ @身份证 @GeneratedValue(策略=GenerationType.AUTO) @

如何使用最少数量的查询获取所有多对多关系? 我的意思是没有任何
n+1查询
。 3-这很正常

我有一个实体:

@实体
@表(name=“tags”)
公共类标签{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”)
私人长id;
@列(name=“title”)
私有字符串标题;
}
@实体
@表(name=“stations”)
公营电台{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”)
私人长id;
@列(name=“title”)
私有字符串标题;
}
@实体
@表(name=“songs”)
公开课歌曲{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”)
私人长id;
@列(name=“title”)
私有字符串标题;
@许多
@可接合(
name=“songs\u电台”,
joinColumns={
@连接柱(
name=“song_id”,
referencedColumnName=“id”
)
},
反向连接列={
@连接柱(
name=“station\u id”,
referencedColumnName=“id”
)
}
)
私人名单站;
@许多
@可接合(
name=“songs\u标签”,
joinColumns={
@连接柱(
name=“song_id”,
referencedColumnName=“id”
)
},
反向连接列={
@连接柱(
name=“tag\u id”,
referencedColumnName=“id”
)
}
)
私有列表标签;
}
和存储库:

公共接口SongRepository扩展了Crudepository{
@查询(“从歌曲中选择s左连接提取s.tags左连接提取s.stations”)
公共列表completeFindAllSongs();
}
  • 因此,我不能在
    completeFindAllSongs()
    中使用即时加载,原因是
    无法同时提取多个行李
  • 无法使用
    @NamedEntityGraph
  • 我无法手动加载数据,因为我无法访问
    songs\u标签
  • 请不要建议使用
    @LazyCollection
我该怎么办

因此,我无法在completeFindAllSongs()中使用快速加载,因为无法同时获取多个包

如果您将实体更改为使用“Set”而不是“List”处理一对一和多对多关系,则此错误应该会消失

编辑:所以对你的问题的回答是:你只需要一个查询。只需使用集合并急切地获取您想要的任何内容

因此,我无法在completeFindAllSongs()中使用快速加载,因为无法同时获取多个包

如果您将实体更改为使用“Set”而不是“List”处理一对一和多对多关系,则此错误应该会消失


编辑:所以对你的问题的回答是:你只需要一个查询。只需使用集合并立即获取所需内容。

请记住,通过联合获取多个集合,您将在集合行之间创建完整的笛卡尔积,这可能会对数据库和应用程序端的性能产生巨大的负面影响


您可能想考虑以批方式初始化集合。

请记住,通过连接获取多个集合,您在集合行之间创建了完全笛卡尔积,这可能对数据库和应用程序都有巨大的负面性能影响。


您可能想考虑使用批处理初始化集合。

这就是为什么我希望看到3个单独查询而不是使用一个连接)<代码> @ BATCHSIZE 这是一个非常好的东西。也许jpa有这样的东西?不,目前还没有jpa的等价注释;目前,JPA将大部分延迟加载细节留给提供商处理。这就是为什么我希望看到3个单独的查询,而不是一个带有连接的查询)
@BatchSize
这是一个非常好的东西。也许jpa有这样的东西?不,目前还没有jpa的等价注释;目前,JPA将大部分延迟加载细节留给提供商处理。