mybatis test把空字符串解析为0
直接入主题:
一个mybatis的Mapper文件
xxxxMapper(Map<String,Object>params);
相关xml代码片段:
<if test="packageType!= null and packageType!= '' or packageType == 0">
and package_type = #{packageType,jdbcType=TINYINT}
</if>
service端部分代码:
Map<String,Object>params = new HashMap<>();
params.put("packageType","");
最初的设想,前端页面传入packageType条件为空字符串时,不把packageType作为过滤条件,但是上面的代码却达不到效果,下面从源码入手分析下为什么产生上述效果:
SimpleNode::getValue -->SimpleNode::evaluateGetValueBody-->ASTEq::getValueBody-->OgnlOps::equal-->OgnlOps::compareWithConversion
protected Object evaluateGetValueBody(OgnlContext context, Object source)
throws OgnlException
{
context.setCurrentObject(source);
context.setCurrentNode(this);
if (!_constantValueCalculated)
{
_constantValueCalculated = true;
boolean constant = isConstant(context);
if (constant)
{
_constantValue = getValueBody(context, source);
}
_hasConstantValue = constant;
}
return _hasConstantValue ? _constantValue : getValueBody(context, source);
}
要找到原因不耐烦的话可以直接跳转到OgnlOps::compareWithConversion方法
public static int compareWithConversion(Object v1, Object v2)
{
int result;
if (v1 == v2) {
result = 0;
} else {
int t1 = getNumericType(v1), t2 = getNumericType(v2), type = getNumericType(t1, t2, true);
switch(type) {
case BIGINT:
result = bigIntValue(v1).compareTo(bigIntValue(v2));
break;
case BIGDEC:
result = bigDecValue(v1).compareTo(bigDecValue(v2));
break;
case NONNUMERIC:
if ((t1 == NONNUMERIC) && (t2 == NONNUMERIC)) {
if ((v1 instanceof Comparable) && v1.getClass().isAssignableFrom(v2.getClass())) {
result = ((Comparable) v1).compareTo(v2);
break;
} else {
throw new IllegalArgumentException("invalid comparison: " + v1.getClass().getName() + " and "
+ v2.getClass().getName());
}
}
// else fall through
case FLOAT:
case DOUBLE:
double dv1 = doubleValue(v1),
dv2 = doubleValue(v2);
return (dv1 == dv2) ? 0 : ((dv1 < dv2) ? -1 : 1);
default:
long lv1 = longValue(v1),
lv2 = longValue(v2);
return (lv1 == lv2) ? 0 : ((lv1 < lv2) ? -1 : 1);
}
}
return result;
}
最终会走到上面标红部分代码,而空字符串也会被转换成double的0.0,此时当空字符串时packageType!= null and packageType!= '' or packageType == 0这个判断就会返回true,下面给出解决方案:
<if test="packageType!= null and packageType!= '' or packageType == '0'.toString()">
and package_type = #{packageType,jdbcType=TINYINT}
</if>
mybatis test把空字符串解析为0相关推荐
- 空字符,空格字符,空字符串,unicode表示字符
unicode码编码规则 unicode码对每一个字符用4位 16进制数表示,即两个字节 ascall码 一个字符,占一个字节 所以用unicode码表示 ascall里面的字符 前面 ...
- mybatis 解析Integer为0的属性,解析成空字符串
使用Mybatis时,常常会判断属性是否为空 1 <if test="type != null and type != ''"> 2 and type = #{type ...
- Mybatis Integer类型参数值为0时判断为空、空字符串不通过
根据状态查询是,由于status是Integer类型,所以当前状态为0时,变成了查询了所有的状态信息. <if test="requestParam.status != null an ...
- 关于json格式字符串解析并用mybatis存入数据库
园子里面找了很多关于json解析后存入数据库的方法,不是太乱,就是没有写完,我下面的主题代码多是受下面两位的启发,请按顺序查看 http://www.cnblogs.com/tian830937/p/ ...
- Gson解析空字符串异常的处理
更多前沿课程:元宇宙:人类社会数字化转型(开学第一课)--机器学习视频教程-人工智能-CSDN程序员研修院 https://edu.csdn.net/course/detail/30449 Sprin ...
- 当类型设置为Integer时,传入的值为0,会将其转化为空字符串,从而造成查询数据异常
今天在写一个普通的查询,条件查询状态为0时,查询总是异常,debug获取的参数都没问题,但查询后的结果是查询所有的数据 可以正常从前台获取数据: sql语句和代码写的都没毛病,后来仔细查阅了资料发现当 ...
- pandas使用read_csv函数读取文件并解析日期数据列(parse dates)、pandas使用read_csv函数读取文件并将缺失值转化为空字符串
pandas使用read_csv函数读取文件并解析日期数据列(parse dates).pandas使用read_csv函数读取文件并将缺失值转化为空字符串 目录
- 字符串分隔 -连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。...
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100) 输 ...
- Javascript中的0,false,null,undefined,空字符串对比
先看一段代码: <script type="text/javascript">alert(typeof (false) === "boolean") ...
最新文章
- 《SAP FIORI 开发入门》课程答疑 第二期
- 批量图片压缩工具:JPGCompact 2.0绿色版
- mysql 获取刚插入行id汇总
- 【干货】产品经理解决问题七步法则
- java amqp_AMQP协议
- 介绍Node assert, should.js, mocha, Karma, Travis CI
- 解决linux系统WIFI无法使用5GHz频率的问题
- JSP开发常用问题解决
- java生成流程图_java源代码转换为流程图
- 数据系统服务器更新是什么,更新客户端数据,除了轮询请求服务端,还有什么解决方案?...
- 亚马逊广告基础、打法及报表分析(一)
- python文字游戏攻防_一个简单的孙悟空斗牛魔王的文字游戏
- vendor分区的库无法调用system分区的库
- 爬虫练习三:爬取链家二手房信息
- 怎么用matlab画心形曲线方程,matlab画心形曲线
- html--样式的建立style,css样式
- 如何实现限制上传或下载速度
- 【老李的模拟赛】【#4】【2014-08-09】
- HDOJ2955 Robberies(01背包,概率)
- 考研英语 - word-list-38
热门文章
- 什么叫html格式化,format是什么意思 格式化自己,只为删除你???
- OpenAnolis开源社区的萌芽与发展
- Kafka源码分析10:副本状态机ReplicaStateMachine详解 (图解+秒懂+史上最全)
- U3D-3D MAX Biped导出.fbx到Unity的Humanoid的骨架不匹配(Disable Triangle Pelvis, Enable Triangle Neck)
- 使用JAVA对象和JSON相互转换问题
- 【激光测距仪方案】激光测距仪的测量原理及作用方法
- Acwing 905. 区间选点
- Brendan Collins:物联网如何改变了你对存储的看法
- 拦截手机发送的请求,对请求信息进行获取
- 2016百度之星 初赛(Astar Round2B) 1001 区间的价值