我有以下设置
Seizure {
private SeizureI18n seizureI18n;
@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public SeizureI18n getSeizureI18n() {
return this.seizureI18n;
}
}
SeizureI18n {
private Seizure seizure;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "seizureI18n")
public Seizure getSeizure() {
return this.seizure;
}
}
当我使用以下 Criteria
查询发出查询时(观察别名的使用情况)
criteria = metaDataConsole.session.createCriteria(Seizure.class,"Seizure");
criteria.createCriteria("Seizure.seizureI18n");
criteria.list();
它会产生以下 SQL 查询。
FROM incbszdb.seizure this_
INNER JOIN incbszdb.seizure_i18n seizurei18x1_
ON this_.id = seizurei18x1_.id
LEFT OUTER JOIN incbszdb.seizure seizure4_
ON seizurei18x1_.id = seizure4_.id
第二次癫痫发作在哪里
LEFT OUTER JOIN incbszdb.seizure seizure4_
ON seizurei18x1_.id = seizure4_.id
来自哪里?
最佳答案
我认为 Hibernate 添加此连接是因为,在加载 SeizureI18n 时,它无法知道 SeizureI18n 是否具有关联的 Seizure。因此,无法知道他是否必须用 null 或 Seizure 实例(或 Seizure 实例的代理)填充 Seizure 字段。当然,在这个特定的查询中,这似乎很奇怪。但如果你只是加载 SeizureI18n 而没有 Seizure,那感觉会更正常。
如果 SeizureI18n 始终具有关联的 Seizure,则应将该关联标记为非可选 (可选 = false
)。我认为它应该避免额外的连接(因为 Hibernate 知道存在关联的 Seizure,因此该属性永远不会为 null)。
关于java - Hibernate Criteria API - 创建自动连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067714/