Hibernate标准 - 内部加入OR条件

时间:2017-08-03 09:03:45

标签: java mysql hibernate hibernate-criteria

我想忽略 createAlias 中的默认加入限制。我有一个OnetoOne关系。

我的问题是Hibernate为连接关系生成默认限制。

POJO的

注意:在控制表中没有用于diagnosticTemplate的列。

Charge.java

 @OneToOne(mappedBy = "charge")
 private DiagnosticTemplate diagnosticTemplate;

DiagnosticTemplate.java

@OneToOne
@JoinColumn(name = "charge")
@Exclude
private Charge charge;

查询

select 
  * 
from 
  charges c 
inner join diagnostic_template dt 
  on (dt.charge = c.id and dt.status=1) or (dt.status=0)

标准

Criteria criteria = getSession().createCriteria(Charge.class, "charge")
      .createAlias("charge.diagnosticTemplate", "diagnosticTemplate",
        JoinType.INNER_JOIN,
        Restrictions.or(
           Restriction.and(Restrictions.eqProperty("charge.id", 
                         "diagnosticTemplate.charge"), 
           Restrictions.eq("diagnosticTemplate.status",true)),
           Restrictions.eq("diagnosticTemplate.status",false)  ))

Hibernate查询

select 
  * 
from 
  charges c 
inner join diagnostic_template dt 
  on dt.charge = c.id and (dt.charge = c.id and dt.status=1) or (dt.status=0)

如何避免这种情况?或者我的关系有什么问题?

请帮忙..!

1 个答案:

答案 0 :(得分:0)

当您使用charge加入charge.diagnosticTemplate时,这意味着Hibernate会尝试使用此DiagnosticTemplate查找链接charge 。因此,生成的条件dt.charge = c.id确实有意义。

请记住,您已使用外键定义关系。因此,Hibernate无法理解像dt.status=0这样的软关系。

如果您仍希望实现查询,可以考虑间接加入两个实例(不使用关联路径)。请参阅How to join Multiple table using hibernate criteria where entity relationship is not direct?