如何按ID

时间:2017-01-12 23:27:43

标签: java spring hibernate jpa

你能帮我解决一个小问题吗? 它涉及Spring Data,JPA和Hibernate的项目。

我有2个实体,我需要彼此加入。是的,听起来很简单:)

首先是活动:

public class Activity {
  ...

  @Column(name="STATUS_ID")
  private String statusId;

  ...
}

其次是Vocab Value(用户可以将其作为一个简单的值列表来管理):

public class VocabValue {
  ...

  // Type of vocab (in our case - 'ACT_STAT')
  @Column(name="TYPE")
  private String type;

  // Name - code of Vocab value
  @Column(name="NAME")
  private String type;

  // Value
  @Column(name="VAL")
  private String value;

  ...
}

在我的情况下,我希望在活动中存储Vocab Value的名称并加入它。

在目标状态下,我的实体应如下所示:

public class Activity {
  ...

  @Column(name="STATUS_ID")
  private String statusId;

  @... what?
  private String status;

  // Getter returns Vocab Value in accordance with the following join spec (pseudo-sql):
  // select voc.value from VocabValue voc where voc.name = %statusId% and type = 'ACT_STAT'
  public String getStatus() {
  }

  ...
}

我应该如何配置我的Activity实体来提供此功能? 好的,有可能吗?

我很感激你的意见!

感谢!

更新13.01

我尝试过这个解决方案:

public class Activity {

  ...
  @Column(name="STATUS_ID")
  private String statusId;

  @JoinColumn(name = "STATUS_ID", referencedColumnName = "NAME",   insertable = false, updatable = false)
  @Where(clause = "type = 'ACT_STAT'")
  @ManyToOne(optional = true)
  @NotFound(action = NotFoundAction.IGNORE)
  private VocabValue status;

  ...
}

此外,我必须使VocabValue实现Serializable(VocabValue作为Detached实体应该按照Hibernate规范实现Serializable接口)。

public VocabValue implemets Serializable {...}

它有效,但注释@Where不起作用:仅使用@JoinColumn规范进行连接,@ Where子句中定义的附加标准不适用。

是否有解决方法?

更新13.01 - 2

通过以下配置解决:

@JoinFormula(value="SELECT v.ROW_ID FROM VOCAB v WHERE v.NAME=STATUS_ID AND v.TYPE='ACT_STAT'") 
@ManyToOne 
@NotFound(action = NotFoundAction.IGNORE) 
private VocabValue status;

谢谢!)

1 个答案:

答案 0 :(得分:0)

通过以下配置解决:

@JoinFormula(value="SELECT v.ROW_ID FROM VOCAB v WHERE v.NAME=STATUS_ID AND v.TYPE='ACT_STAT'") 
@ManyToOne 
@NotFound(action = NotFoundAction.IGNORE) 
private VocabValue status;

谢谢)