java - 带有@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准备查询?
解决方案
最后我意识到我错误地引用了“子”表。代替
@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;
所以,它现在有效。
推荐阅读
- bash - 如何让 bash IFS 在不需要换行符的情况下获取列表中的最后一个文件
- salt-stack - 在 saltstack 中存储数据的最佳位置是什么
- node.js - 我可以在环回中操作要保存在 beforeRemote 方法中的数据吗?
- wcf - 如何停止发送接受标头?
- react-native - 在最初隐藏然后在用户操作中可见的元素上获取触摸事件
- javascript - 如何一次使用 API 在 Shopify 上创建多个 webhook
- android - Fragment 工具栏上方奇怪的空白区域。如何解决?
- r - How to read all files in S3 folder/bucket using sparklyr in R?
- amazon-web-services - 集成 Amazon Connect Stream API 和 Lambda API 网关
- c# - Expression.Coalesce 的转换参数是什么?