java - 如何以最少的查询次数获取所有多对多关系?

标签 java hibernate jpa spring-boot spring-data

如何使用最少数量的查询获取所有多对多关系? 我的意思是没有任何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/

相关文章:

java - 如何在 Eclipse 动态 Web 应用程序中使用 java jar 库

java.lang.NullPointerException

java - Java EE/Jakarta EE 是否支持 Java 模块系统?是否可以使用 Java 模块系统制作 Web 应用程序?

oracle - Hibernate 分页或批处理

java - spring boot 启动应用程序错误

java - 使用 Hikari CP 检测到明显的连接泄漏

java - JPA外键零0值 hibernate TransientPropertyValueException

java - 如何在阔叶树中获取 entityManager 的静态实例?

java - 在 Spring 5.0 中设置 Spring 的 RestTemplate 的基本 URL/URI

java - Spring Boot Hibernate 没有事务正在进行