如何使用 Hibernate 结合 @ManyToMany 关联的高效查询?

How to use Hibernate to combine efficient queries on @ManyToMany association?

我有 2 个实体,它们之间有 ManyToMany 关联 - FeedbackAppFeedbackAppProfile,每个实体都有一个 tenant-id FK 到 Tenant 实体.

FeedbackApp 实体:

public class FeedbackApp {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
       
    @ManyToOne
    @JoinColumn(name = "tenant_id")
    private Tenant tenant;

    /*
        Marked as the owner side.
     */
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "feedbackApp_profile_mapping",
            joinColumns = @JoinColumn(name = "feedbackApp_id"),
            inverseJoinColumns = @JoinColumn(name = "profile_id"))
    Set<FeedbackProfile> profiles;
}

FeedbackProfile 实体:

public class FeedbackProfile {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "tenant_id")
    private Tenant tenant;

    
    @ManyToMany(mappedBy = "profiles", fetch = FetchType.EAGER)
    Set<FeedbackApp> feedbackApps;
}

feedbackApp_profile_mapping 联接 table 有 2 列,如下所示:

我的问题:我需要创建一个查询来获取特定反馈配置文件和租户 ID 的所有反馈应用程序。是否可以通过 Hibernate/JPA 获取它,或者我必须手动查询我的连接 table?

让 Jpa 担心要生成的最佳 Sql 查询。您的 Jpa/criteria/specification 查询应该类似于

select fp.feedbackApps from FeedbackProfile fp LEFT JOIN FETCH fp.feedbackApps where fp.id=:feedback_profile_id and fp.tenant.id=:tenant_id

既然你问的是效率,最好从两个多对多映射中删除 fetch = FetchType.EAGER 并使用 join fetch 或命名 entity graphs 仅在需要时进行连接到.

感谢@GabiM 的指导,我创建了一个 join fetch 查询,它完成了我需要的工作:

@Query(value = "SELECT f FROM FeedbackApp f JOIN FETCH f.profiles p WHERE p.id = ?1 AND p.tenant.id = ?2")
    Set<FeedbackApp> getFeedbackAppsByProfileId(long profileId, long tenantId);