博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate left join fetch 出错的问题
阅读量:4500 次
发布时间:2019-06-08

本文共 2766 字,大约阅读时间需要 9 分钟。

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

你可能感兴趣的文章
OpenCV——图像修补
查看>>
网络概述
查看>>
IntelliJ IDEA - 热部署插件JRebel 安装使用教程
查看>>
(转)华为 安卓手机在MAC系统下 ADB 识别
查看>>
Redis的LRU算法
查看>>
高精度算法
查看>>
ABP WebApi 加载错误
查看>>
iTerm的安装以及配置Oh My Zsh
查看>>
windows上的alfred
查看>>
uc/os 上下文切换
查看>>
COJ 2108 Day7-例1
查看>>
自定义 DateTime 格式字符串
查看>>
如何利用报表工具FineReport实现报表列的动态展示
查看>>
ASP.NET基础学习(暴力破解密码)
查看>>
实验11——指针的基础应用
查看>>
FastCGI模块(FastCGI)
查看>>
v-for遍历出的元素上添加click事件,获取对应元素上的属性id值
查看>>
配置打开IE浏览器
查看>>
SVN A C D M G U R I 的含义
查看>>
ZooKeeper--大数据系统的僚机
查看>>