假设我有一个名为UserProfile的主用户表,上面有一个显示名称。

我有多个模块可以加入,其中包含UserProfileModuleId,以表示您的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对代码示例进行了测试。

10-07 15:51