【问题标题】:Hibernate Entity Join by custom field通过自定义字段加入休眠实体
【发布时间】:2019-11-26 11:24:05
【问题描述】:

我有两个实体 - 用户和角色如下

@Entity
@Table(name = "USER")
public class UserObj implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "USER_ID")
    private long userId;

    @Column(name = "USER_NM")
    private String userNm;

    @Column(name = "USER_EMAIL")
    private String userEmail;

    @Column(name = "ROLE_ID")
    private String roleId;

    ---getter setter----
}

@Entity
@Table(name = "ROLE")
public class RoleObj implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ROLE_ID")
    private long roleId;

    @Column(name = "ROLE_NM")
    private String roleNm;

    @Column(name = "ROLE_DESC")
    private String roleDesc;

    ---getter setter----
}

用户表将具有来自角色表的角色 ID。

查询实体时(使用休眠),如何获取用户对象中的role_nm(不是作为角色对象),但只有role_nm字符串字段。

【问题讨论】:

    标签: hibernate spring-boot spring-data-jpa


    【解决方案1】:

    您需要在 UserObj 类中添加一个字段并使用@Formula 注释。像这样:

    @Fomula( "( SELECT r.role_nm FROM role r WHERE r.role_id = role_id )" )
    private String roleNm;
    

    【讨论】:

    • @Formula 注释解决了我的问题。我可以在实体中添加新字段并为其分配自定义查询。
    【解决方案2】:

    您可以将角色对象添加到具有多对一关系和急切获取类型的用户实体。这样,每当您获取用户对象时,您都会使用用户获取角色对象。

      @ManyToOne(fetch = FetchType.EAGER)
      @JoinColumn(name = "ROLE_ID")
      private RoleObj roleObj;
    

    之后你就可以得到这样一个用户的roleNm

    user.getRoleObj().getRoleNm()
    

    【讨论】:

    • 无法获得整个对象恕我直言..
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多