假设我有一个名为UserProfile
的主用户表,上面有一个显示名称。
我有多个模块可以加入,其中包含UserProfile
和ModuleId
,以表示您的ModuleMembership
。然后,您可以为每个不同的模块创建一个配置文件,以存储与该模块相关的数据,例如,如果您注册了PokerModule
,则将获得PokerProfile
。
我想将显示名称从UserProfile
放到PokerProfile
上,但是我想以一种标准化的方式来做。无论哪种方式,我都可以通过Hibernate或SQL来完成。确切的关系是PokerProfile.membership.userProfile.displayName
-如何将它放入@Column
类的PokerProfile
中?
最佳答案
您可以使用derived property来获取displayName
类中的PokerProfile
,如下所示:
@Formula(
"(SELECT up.displayName"
+ " FROM ModuleMembership mm"
+ " JOIN UserProfile up"
+ " ON (mm.userProfileId = up.userProfileId)"
+ " WHERE mm.moduleMembershipId = membershipId)")
String displayName;
请注意,派生属性仅使用SQL,而不使用HQL。
membershipId
定义为@JoinColumn
属性的membership
名称。其他列名称的定义与此类似。但是,尽管这并不是您真正要求的,但是我通常会在Java中为这样的事情实现自己的快捷方式属性,如下所示:
@Transient
public String getDisplayName() {
if (membership == null) {
return null;
}
UserProfile userProfile = membership.getUserProfile();
return userProfile == null ? null : userProfile.getDisplayName();
}
对我来说,快捷方式属性比相应的SQL更易于读写。
针对H2数据库版本1.4.190,使用Hibernate 5.0.6.Final对代码示例进行了测试。