java - Hibernate Criteria API - 创建自动连接

标签 java hibernate join criteria-api

我有以下设置

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/

相关文章:

java - 无法获取 Java 邮件的正确格式

java - 如何返回二叉树中序遍历的迭代器?

java - 带时间戳和 Hibernate 的日期格式

spring - spring 中 jpa 实体的自动扫描包

linux - 连接字符串之间的行 - bash

java - 如何让方法返回多个对象?

java - 在 ant 脚本中包含外部 JAR 时出错

hibernate - 在grails中,为什么刷新后直接得到StaleObjectStateException?

sql - 连接表时出现问题,需要在分组之前对连接表进行排序

MySQL 在一个查询中使用多个联接来获取结果?