如何使用最少数量的查询获取所有多对多关系?
我的意思是没有任何n+1 查询
。
3 - 这是正常的
我有一个实体:
@Entity
@Table(name = "tags")
public class Tag {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "title")
private String title;
}
@Entity
@Table(name = "stations")
public class Station {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "title")
private String title;
}
@Entity
@Table(name = "songs")
public class Song {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "title")
private String title;
@ManyToMany
@JoinTable(
name = "songs_stations",
joinColumns = {
@JoinColumn(
name = "song_id",
referencedColumnName = "id"
)
},
inverseJoinColumns = {
@JoinColumn(
name = "station_id",
referencedColumnName = "id"
)
}
)
private List<Station> stations;
@ManyToMany
@JoinTable(
name = "songs_tags",
joinColumns = {
@JoinColumn(
name = "song_id",
referencedColumnName = "id"
)
},
inverseJoinColumns = {
@JoinColumn(
name = "tag_id",
referencedColumnName = "id"
)
}
)
private List<Tag> tags;
}
和存储库:
public interface SongRepository extends CrudRepository<Song, Long> {
@Query("SELECT s FROM Song s LEFT JOIN FETCH s.tags LEFT JOIN FETCH s.stations")
public List<Song> completeFindAllSongs();
}
- 因此,我无法在
completeFindAllSongs()
中使用急切加载,因为无法同时获取多个包
- 无法使用
@NamedEntityGraph
- 而且我无法手动加载数据,因为我无权访问
songs_tags
表 - 请不要建议使用
@LazyCollection
我应该做什么?
最佳答案
so, i can't use eager loading in completeFindAllSongs() cause of cannot simultaneously fetch multiple bags
如果您将实体更改为对 OneToMany 和 ManyToMany 关系使用“Set”而不是“List”,此错误应该会消失。
编辑:所以回答你的问题是:你只需要 1 个查询。只需使用 Sets 并立即获取您想要的任何内容。
关于java - 如何以最少的查询次数获取所有多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36748993/