如何使用 Hibernate 结合 @ManyToMany 关联的高效查询?
How to use Hibernate to combine efficient queries on @ManyToMany association?
我有 2 个实体,它们之间有 ManyToMany
关联 - FeedbackApp
和 FeedbackAppProfile
,每个实体都有一个 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);
我有 2 个实体,它们之间有 ManyToMany
关联 - FeedbackApp
和 FeedbackAppProfile
,每个实体都有一个 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);