hibernate left join fetch 出错的问题

1.首先说说manyToOne的问题

比如一个用户所在的组织机构,可能是多个,最多是四个,然后userEntity有下的代码:

 

关联查询:

第一种方式:代码如下

StringBuilder sql = new StringBuilder();
sql.append("select a.zdbh as zdbh, a.username as username, a.xm as xm,a.yhzt as yhzt, ")
.append(" a. jg1.zzjgid as jgid1,    a. jg2.zzjgid as jgid2,   a.  jg3.zzjgid as jgid3,   a. jg4.zzjgid as jgid4, ")
.append(" a. jg1.jgmc as jgmc1,   a. jg2.jgmc as jgmc2,  a. jg3.jgmc as jgmc3,     a. jg4.jgmc as jgmc4 ")
.append(" from IppcXtglYhxxEntity as a ")

 

上面查询的问题是,会丢失某些用户,因为机构4个字段,部分会是空,通过show sql,可以看到,转换的SQL是等值连接查询:

select
ippcxtglyh0_.zdbh as col_0_0_,
ippcxtglyh0_.username as col_1_0_,
ippcxtglyh0_.xm as col_2_0_,

ippcxtglyh0_.yhzt as col_4_0_,
ippcxtglyh0_.jgid1 as col_5_0_,
ippcxtglyh0_.jgid2 as col_6_0_,
ippcxtglyh0_.jgid3 as col_7_0_,
ippcxtglyh0_.jgid4 as col_8_0_,
ippcxtglzz2_.jgmc as col_9_0_,
ippcxtglzz3_.jgmc as col_10_0_,
ippcxtglzz4_.jgmc as col_11_0_,
ippcxtglzz5_.jgmc as col_12_0_
from
ippc_xtgl_yhxx ippcxtglyh0_,
ippc_xtgl_zzjg ippcxtglzz2_,
ippc_xtgl_zzjg ippcxtglzz3_,
ippc_xtgl_zzjg ippcxtglzz4_,
ippc_xtgl_zzjg ippcxtglzz5_

where
ippcxtglyh0_.jgid1=ippcxtglzz2_.zdbh
and ippcxtglyh0_.jgid2=ippcxtglzz3_.zdbh
and ippcxtglyh0_.jgid3=ippcxtglzz4_.zdbh
and ippcxtglyh0_.jgid4=ippcxtglzz5_.zdbh

and ippcxtglyh0_.bhzxid=20

 

修改后,方案二:通过left join,不会丢失数据

上述SQL:转换后的原生态的Sql如下:

select
ippcxtglyh0_.zdbh as col_0_0_,
ippcxtglyh0_.username as col_1_0_,
ippcxtglyh0_.xm as col_2_0_,
ippcgybhzx5_.mc as col_3_0_,
ippcxtglyh0_.yhzt as col_4_0_,
ippcxtglzz1_.zdbh as col_5_0_,
ippcxtglzz2_.zdbh as col_6_0_,
ippcxtglzz3_.zdbh as col_7_0_,
ippcxtglzz4_.zdbh as col_8_0_,
ippcxtglzz1_.jgmc as col_9_0_,
ippcxtglzz2_.jgmc as col_10_0_,
ippcxtglzz3_.jgmc as col_11_0_,
ippcxtglzz4_.jgmc as col_12_0_
from
ippc_xtgl_yhxx ippcxtglyh0_
left outer join
ippc_xtgl_zzjg ippcxtglzz1_
on ippcxtglyh0_.jgid1=ippcxtglzz1_.zdbh
left outer join
ippc_xtgl_zzjg ippcxtglzz2_
on ippcxtglyh0_.jgid2=ippcxtglzz2_.zdbh
left outer join
ippc_xtgl_zzjg ippcxtglzz3_
on ippcxtglyh0_.jgid3=ippcxtglzz3_.zdbh
left outer join
ippc_xtgl_zzjg ippcxtglzz4_
on ippcxtglyh0_.jgid4=ippcxtglzz4_.zdbh cross
join
ippc_gy_bhzx ippcgybhzx5_
where
ippcxtglyh0_.bhzxid=ippcgybhzx5_.zdbh
and ippcxtglyh0_.bhzxid=20

方案二是修改后的SQL,本来写的SQL中加入了fetch,即left join fetch a.jg1 as jg1

遇到的问题是

query specified join fetching, but the owner of the fetched association was not present in the select list

代码

原因分析:如果使用了fetch,拥有者一定要出现在select中,也就是上面的IppcXtglYhxxEntity as a, a必须出现在select语句中

例如将上面改为select a... 这样就会执行正常,

因为使用了fetch,Hibernate就会将需要fetch的对象(jd1、jg2、jg3、jg4)立即加载在父对象(IppcXtglYhxxEntity )中

,而我的select拥有者(IppcXtglYhxxEntity )并没有present(出席在结果集中),那么就会出现以上错误.

 解决办法:将fetch去掉即可 或者 修改select,改成select a,....

我采用的是去掉fetch的方法。

 

个人项目遇到问题,如需转载,请注明出处!!!

posted on 2018-09-07 11:17  美丽的小鹿  阅读(1635)  评论(0编辑  收藏  举报