我有这个简单的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
)
你可以看到邮政编码值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'