Hibernate Criteria API - 创建自动连接

时间:2011-08-15 16:29:29

标签: 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 

来自?

1 个答案:

答案 0 :(得分:1)

认为 Hibernate添加了这个连接,因为在加载SeizureI18n时,它无法知道SeizureI18n是否有相关的Seizure。因此,它无法知道是否必须使用null或Seizure实例(或Seizure实例的代理)填充占用字段。当然,在这个特定的查询中,它似乎很奇怪。但是如果你只是在没有癫痫发作的情况下装载SeizureI18n,那就更正常了。

如果SeizureI18n始终具有关联的癫痫发作,则应将关联标记为非可选(optional = false)。我认为它应该避免额外的连接(因为Hibernate会知道有一个关联的Seizure,因此该属性永远不会为null)。