2016-08-16 59 views
8

我有这个简单的Hibernate代码。Java Hibernate Bug错误的参数绑定

public List<Student>bug(){ 
    //SimpleCriteria 
    final Criterion eq = and(Restrictions.eq("fdl","N"),Restrictions.eq("cid",1),Restrictions.eq("did",2)); 
    return currentSession().createCriteria(Student.class)     
      .createAlias("school","s",JoinType.INNER_JOIN,Restrictions.eq("zipCode",1764))    
      .createAlias("address","a",JoinType.LEFT_OUTER_JOIN,eq) 
      .setProjection(addProjection("id")) 
      .setResultTransformer(transformer(Student.class))     
      .list(); 
}  

的问题是参数并以某种方式紊乱或混合或者在错误的位置每一个当我创建两个createAlias都是具有至少一个这样的标准(参见下面的更新)

createAlias问题出现随着一些判别

createAlias("school","s",JoinType.INNER_JOIN,Restrictions.eq("zipCode",1764))    
createAlias("address","a",JoinType.LEFT_OUTER_JOIN,eq) 

生成的SQL似乎不错..

select 
    this_.ID as y0_ 
from 
    student this_ 
left outer join 
    address address2_ 
     on this_.C05=address2_.ID 
     and (
      (
       address2_.FDL=? 
       and address2_.CID=? 
       and address2_.DID=? 
      ) 
     ) 
inner join 
    school school_ 
     on this_.C03=school_.ID 
     and (
      school_.C06=? //ZIPCODE 
     ) 

甚至当我看到log4j的,我可以看到错误的结合 enter image description here

你可以看到邮政编码值1764绑定到这是address2_.FDL

binding parameter [1] as [INTEGER] - [1764] 

后来的第二个参数的第一个参数这是CID被分配给FDL正确先前值是“N”

Message: binding parameter [2] as [VARCHAR] - [N] 

后来其没有被分配正确的先前值用于CID第三个参数为1

binding parameter [3] as [INTEGER] - [1] 

后来在这四个参数是邮政编码指定正确的前一个值都为2

binding parameter [4] as [INTEGER] - [2] 

当然的generatedsql比赛log4j的结合

select 
    this_.ID as y0_ 
from 
    student this_ 
left outer join 
    address address2_ 
     on this_.C05=address2_.ID 
     and (
      (
       address2_.FDL=1764 
       and address2_.CID='N' 
       and address2_.DID=1 
      ) 
     ) 
inner join 
    school school_ 
     on this_.C03=school_.ID 
     and (
      school_.C06=2 //ZIPCODE 
     ) 

正如你所看到的绑定显然是错误的。

预计< ---------------->现实

1 parameter fdl should be bind to 'N' but is bind to zipCode value which is 1764 
2 parameter cid should be bind to 1 but is bind to fdl value which is 'N' 
3 parameter did should be bind to 2 but is bind to cid value which is 1 
4 parameter zipCode should be bind to 1764 but is bind to did value which is 2 

什么,我认为正在发生的休眠混合某种原因的参数位置。

我在使用Hibernate 4.3.4遇到这个问题时,但是我看到一个类似的bug,它在5.2.2中修复了https://hibernate.atlassian.net/browse/HHH-10991,我升级到了Hibernate 5.2.2,遇到同样的问题我见过很多论坛报道这个问题,为什么hibernate不能解决它?当然,我有解决方法,但这个问题很烦人

如果我用2个createAlias用不标准的一切工作像预期

createAlias("school","s",JoinType.INNER_JOIN,Restrictions.eq("zipCode",1764))    
createAlias("address","a",JoinType.LEFT_OUTER_JOIN) 

环境

Java: 1.8.0_74; Java HotSpot(TM) 64-Bit Server VM 25.74-b02 
Hibernate 5.2.2 and 4.3.4 tested in both. 
Netbeans NetBeans IDE 8.1 (Build 201510222201) 

另一个similiar论坛

https://forum.hibernate.org/viewtopic.php?f=1&t=947018 
https://forum.hibernate.org/viewtopic.php?f=1&t=971534 
https://hibernate.atlassian.net/browse/HHH-2496 
https://hibernate.atlassian.net/browse/HHH-1743 

UPDATE

参数出错2个参数

public List<Student>bug(){ 
    return currentSession().createCriteria(Student.class)     
    .createAlias("school","s",JoinType.INNER_JOIN,Restrictions.eq("zipCode",1764))    
    .createAlias("address","a",JoinType.LEFT_OUTER_JOIN,Restrictions.eq("fdl","N")) 
    .setProjection(addProjection("id")) 
    .setResultTransformer(transformer(Student.class))     
    .list(); 
}  

即使正如你所看到的结合显然是错误的。

预计< ---------------->现实

1 parameter fdl should be bind to 'N' but is bind to zipCode value which is 1764 
2 parameter zipCode should be bind to 1764 but is bind to fdl value which is 'N' 

回答

6

......而同样的问题,遇到我已经看到了很多论坛的报告此问题为什么hibernate不能解决它?

org.hibernate.Criteria API已经被废弃:

Hibernate提供一个较旧的,传统的org.hibernate.Criteria API,它 应该考虑废弃。没有功能开发将针对 这些API。最终,Hibernate的相关标准特征将是 移植作为扩展到JPA javax.persistence.criteria.CriteriaQuery

因此,您不应期望在将来的版本中与org.hibernate.Criteria API(包括错误修复)相关的很多努力。

我建议你迁移到JPA CriteriaQuery API。然而,我个人也不喜欢它,我总是直接使用JPQL/HQL或QueryDSL,我发现它是JPQL字符串和CriteriaQuery API的高度冗余之间的很好平衡。