mybatis oracle 不能返回 null 列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis oracle 不能返回 null 列相关的知识,希望对你有一定的参考价值。
我在oracle tool 执行的话 有null的值都能查询
但是在mybatis执行的话 数字里有null的列 一个都不能查询
spring + mybatis + springmvc
mybatis3.2.8
mybatis-spring 1.1.1
我query 没有写错的,因为oracle tool 执行的话 都能查询的。
---------------------------------
以下代码
<select id="r2_list" resultType="java.util.HashMap">
select
m.ib_haggwa_nm,
m.ib_haggwa_cd,
m.coll_scnt coll_scnt, --numeric
s.coll_scnt snt, --numeric 有null ,不是null的可以查询出来
a.cnt acnt, --numeric 网页上一个都不能查询这个列 全部出来null了,但是很多不是null
b.cnt bcnt, --numeric 网页上一个都不能查询这个列 全部出来null了,但是很多不是null
c.cnt ccnt, --numeric 网页上一个都不能查询这个列 全部出来null了,但是很多不是null
d.entr_nm --varchar 有null,不是null的可以查询出来
from
(
select distinct ib_haggwa_cd,max(ib_haggwa_nm) ib_haggwa_nm,sum(coll_scnt) coll_scnt,max(seq)seq from ib_haggwa_cd
where
..
)m,
(
select
ib_haggwa_cd,sum(coll_scnt) coll_scnt
from T_BB
..
)s,
(
select sb_haggwa_cd1,count(*) cnt from T_AA aa where entr_gb='A'
..
)a,
(
select sb_haggwa_cd1,count(*) cnt from T_AA aa where entr_gb='A'
..
)b,
(
select sb_haggwa_cd1,count(*) cnt from T_AA aa where entr_gb='A'
..
)c,
(
select
ib_haggwa_cd,sum(coll_scnt) coll_scnt, entr_nm
from T_BB
..
)d
where
m.ib_haggwa_cd = s.ib_haggwa_cd(+)and
m.ib_haggwa_cd = a.sb_haggwa_cd1(+)and
m.ib_haggwa_cd = b.sb_haggwa_cd1(+)and
m.ib_haggwa_cd = c.sb_haggwa_cd1(+) and
m.ib_haggwa_cd = d.ib_haggwa_cd(+)
order by m.seq
</select>
条件中,null的,不能用=查询,要用 is null判断追问
这个两个 我都 准守了
用plsql tool 执行的话 都出来了
oracle子查询中not in后面不能为null值的理解
首先说说oracle中的null值吧。
null在oracle中代表未知,表示可能有,也可能没有。任何与null值的普通运算都为null,但可以用一些函数来处理null值,oracle排序中默认null最大。
接着进入正文
这里in后面有null,能返回数据
但加了not后,就不能返回数据了
这里的in后面的句子可以理解为or拼接,即
id in (200,201,null)可以等价于id=200 or id=201or id=null,
id not in (200,201,null)可以等价于not(id=200 or id=201or id=null)或id!=200 and id!=201 and id=null。
为什么都是or拼接,in可以而not in不可以呢,可以把not in理解为后面的and表达式就知道了,因为id=null为null,也就相当于false,导致整个表达式为false,无论传何值都为false,自然无法返回数据。
当然若硬要用or表达式来解释呢,其实可以看not 后面的这个括号,有括号意味着要确定里面的返回值再加not。
例如id为201,整个in 的or表达式为
false or true or null,当执行到true时就可返回,无需看null值了。
而在 not in的or表达式中是
not (fasle or true or null),我的理解是由于括号的存在,需要把表达式全运行一遍,不能向无括号那样运行到true就可返回,所以括号内运行一遍表达式由于有null参与运算,运算之后都为null,相当于false,所以就无法选定行了
当发现not in后的子查询后面有null值是,可以在子查询里用is not null或函数过滤null值。
————————————————
版权声明:本文为CSDN博主「随遇er安」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/longcccvv/article/details/54376015
以上是关于mybatis oracle 不能返回 null 列的主要内容,如果未能解决你的问题,请参考以下文章
mybatis resultType=“Map“ 时, 能不能允许返回的结果值为NULL值
[mybatis]映射文件_参数处理_#取值时指定参数相关规则