JPA,从 joinable table 获取附加列的值

JPA, get value of additional column from joinable table

我有 3 个 table(T_BONUS_TAB、T_COND、T_BONUS_COND_LINK)。 其中之一连接 (T_BONUS_COND_LINK) 两个另外 table。

此 table 有 3 列:bonus_id、cond_id(对父 table 的引用)和另一列具有附加值(优先级)。

create table T_BONUS_COND_LINK
(
  cond_id   NUMBER(9) not null,
  bonus_id NUMBER(9) not null,
  priority NUMBER(1)
)
alter table T_BONUS_COND_LINK
 add constraint T_BONUS_COND_B_FK foreign key (BONUS_ID)
  references T_BONUS_TAB (ROW_ID);
alter table T_BONUS_COND_LINK
 add constraint T_BONUS_COND_M_FK foreign key (COND_ID)
  references T_COND (ROW_ID);

问题是如何获取优先级列的值?

@Entity(name = ENTITY_NAME)
@Table(name = "T_BONUS_TAB")
@Customizer(EclipseLinkIssuesFixer.class)
public class BonusApplication extends AbstractIdentifiableByLongEntity {
      ...
   @OneToMany(fetch = EAGER)
   @JoinTable(
        name="T_BONUS_COND_LINK",
        joinColumns = @JoinColumn( name="BONUS_ID"),
        inverseJoinColumns = @JoinColumn( name="COND_ID")
   )
   private List<Condition> conds;
   ....
}

@Entity(name = ENTITY_NAME)
@Table(name = "T_COND")
@Customizer(EclipseLinkIssuesFixer.class)
public class CONDITION extends AbstractIdentifiableByLongEntity {

   @Id
   @Column(name = "ROW_ID", nullable = false, updatable = false)
   private Long id;

   @Column(name = "NAME", insertable = false, updatable = false)
   private String name;

   @Column(name = "DESCX", updatable = false)
   private String desc;
}

您必须将 T_BONUS_COND_LINK table 映射为具有复合主键的常规实体。

您必须创建一个 ID Class:

@Embeddable
public class BonusCondLinkId {
    Long bonusId;
    Long condId;
    ...
}

你可以这样使用:

@Entity 
@IdClass(BonusCondLinkId.class)
public class BonusCondLink {
    @Id
    private Long bonusId;
    @Id
    private Long condId;
    ...
}

或作为 EmbeddedId:

@Entity 
@IdClass(BonusCondLinkId.class)
public class BonusCondLink {
    @EmbeddedId
    private BonusCondLinkId id;
    ...
}

将采用这样的方式:

@Embeddable
public class BonusCondLinkId implements Serializable {

   private long bonusId;
   private long condId;
}

@Entity
@Table(name="T_BONUS_COND_LINK")
@IdClass(BonusCondLinkId.class)
public class BonusCondLink implements Serializable {

  @Id
  @Column(name="bonus_id")
  private @Getter @Setter long bonusId;

  @Id
  @Column(name="cond_id")
  private @Getter @Setter long condId;

  @Column(name="priority")
  private @Getter @Setter Integer priority;

  @ManyToOne
  @PrimaryKeyJoinColumn(name="BONUS_ID", referencedColumnName="ROW_ID")
  private @Getter @Setter Bonus bonus;

  @ManyToOne
  @PrimaryKeyJoinColumn(name="CON_ID", referencedColumnName="ROW_ID")
  private @Getter @Setter Condition cond;

}

@Entity(name = ENTITY_NAME)
@Table(name = "T_BONUS")
@Customizer(EclipseLinkIssuesFixer.class)
public class Bonus extends AbstractIdentifiableByLongEntity {

   ...

   @OneToMany(mappedBy="bonus")
   @OrderBy("priority")
   private @Getter @Setter List<BonusCondLink> conditions;
}

和 class 条件与 @OneToMany(mappedBy="cond") 类比 Bonus class.