【问题标题】:Hibernate Criteria API - create automatic joinHibernate Criteria API - 创建自动加入
【发布时间】:2011-10-27 10:02:29
【问题描述】:

我有以下设置

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 

来自?

【问题讨论】:

    标签: java hibernate join criteria-api


    【解决方案1】:

    认为 Hibernate 添加了这个连接,因为在加载 SeizureI18n 时,它无法知道 SeizureI18n 是否有关联的 Seizure。所以它无法知道他是否必须用 null 或 Seizure 实例(或 Seizure 实例的代理)填充 Seizure 字段。当然,在这个特定的查询中,它看起来很奇怪。但是如果你只是加载 SeizureI18n 而没有他们的 Seizure,感觉会更正常。

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

    【讨论】:

    • 在 SeizureI18n 中添加了optional = false,与之前的查询相同,还有其他想法吗?
    • Hibernate 创建第二个左连接的原因是 Seizure 和 SeizureI18n 之间的关联被定义为 ONE-to-ONE 这是错误的。我必须更改数据库中的关系,重新创建休眠类和映射,然后休眠创建正确的ONE-to-MANY 关系
    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 2012-02-15
    • 2018-07-24
    • 2013-11-12
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多