首页 > 解决方案 > 带有@ElementCollection 和@CollectionTable 的休眠实体。Hibernate 在检索集合时将属性名称添加到 SQL 语句

问题描述

就我而言,我有两个表:父“VDI_DICT_EMPOYEES_SV”和“VDI_DICT_EMPOYEES_RV”,由具有相同名称“R_OBJECT_ID”的列连接。(见ER图)

在此处输入图像描述

“父”实体的结构是:

@Entity
@Table(name="VDI_DICT_EMPLOYEE_SV")
public class DmDictEmployee {
  @Column (name="R_OBJECT_ID") private String objectId;

... other columns are skipped...

  @ElementCollection
  @CollectionTable(name="VDI_EMPLOYEE_RV, joinColumns=@JoinColumn(name="CROC_SECRETARY_ID",referencedColumnName="R_OBJECT_ID"))
 private List<String> crocSecretaryIds; // the element collection

... getters and setters are skipped too...

}

要获取主从数据,我使用本机 @Query

"SELECT parent.*, chield.CROC_SECRETARY_ID from VDI_DICT_EMPLOYEE_SV parent left outer join VDI_DICT_EMPLOYEE_RV chield on parent.R_OBJECT_ID=chield.R_OBJECT_ID"

(这会在一次选择中选择带有秘书列表的员工条目)

正如我从日志中看到的那样,它工作正常。查询返回数据就好了。但是当我尝试检索 crocSecretaryIds 列表时,我看到 HIBERNATE 准备了包含集合名称的 SQL:“SELECT CROC_SECRETARY_ID, crocSecretaryIds FROM VDI_DICT_EMPLOYEES_RV WHERE R_OBJECT_ID=...”(见下一个屏幕截图)

在此处输入图像描述

这很奇怪。我希望看到没有crocSecretaryIds的 SQL 查询,所以我假设我对 @ElementCollection 列的声明有问题。您能否告知任何想法遗漏了什么以及为什么 HIBERNATE 使用crocSecretaryIds准备查询?

标签: javahibernatedocumentum

解决方案


最后我意识到我错误地引用了“子”表。代替

@ElementCollection
@CollectionTable(name="VDI_EMPLOYEE_RV, joinColumns=@JoinColumn(name="CROC_SECRETARY_ID",referencedColumnName="R_OBJECT_ID"))
 private List<String> crocSecretaryIds; // the element collection

我需要去做:

@ElementCollection
@CollectionTable(name="VDI_EMPLOYEE_RV, joinColumns=@JoinColumn(name="R_OBJECT_ID",referencedColumnName="R_OBJECT_ID"))
@Column(name="CROC_SECRETARY_ID") // the column name in child table
private List<String> crocSecretaryIds; 

所以,它现在有效。


推荐阅读