就我而言,我有两个表:父项“ 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"
(这将选择一个带有秘书列表的员工条目)
而且正如我从日志中看到的那样,它工作正常。查询返回数据就好了。但是,当我尝试检索crocSecretaryId的列表时,我看到HIBERNATE准备了包含集合名称的SQL:“从VDI_DICT_EMPLOYEES_RV WHERE R_OBJECT_ID = ...中选择CROC_SECRETARY_ID,crocSecretaryIds(请参阅下一个屏幕截图)
这很奇怪。我希望看到不带crocSecretaryIds的SQL查询,因此,我认为@ElementCollection列的声明有问题。您能否建议任何想法,以及错过什么以及为什么HIBERNATE使用crocSecretaryIds准备查询?
最后,我意识到我错误地引用了“子”表。代替
@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;
所以,现在可以使用。