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的方法。
?
個人項目遇到問題,如需轉載,請注明出處!!!
轉載于:https://www.cnblogs.com/beautifulFuture/p/9603464.html
總結
以上是生活随笔為你收集整理的hibernate left join fetch 出错的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专利下载查询
- 下一篇: not found error :\te