- 我们项目中之前一直使用自定义sql来进行查询,也一直正常;但在今天添加了一个
ext
字段导致了异常
之前代码:
Sql sql = Sqls.create("INSERT INTO vip_member(senior_type,type, user_id, effective_time, expire_time, creator) " +
"values(@seniorType,@type,@userId,@effectiveTime,@expireTime,@creator) " +
" ON DUPLICATE KEY UPDATE is_deleted='n', expire_time=@expireTime");
sql.setParam("type", data.getType())
.setParam("seniorType", data.getSeniorType())
.setParam("userId", data.getUserId())
.setParam("effectiveTime", data.getEffectiveTime())
.setParam("expireTime", data.getExpireTime())
.setParam("creator", data.getCreator())
singleDao.execute(sql);
有问题代码:
Sql sql = Sqls.create("INSERT INTO vip_member(senior_type,type, user_id, effective_time, expire_time, creator, ext) " +
"values(@seniorType,@type,@userId,@effectiveTime,@expireTime,@creator, @ext) " +
" ON DUPLICATE KEY UPDATE is_deleted='n', expire_time=@expireTime, ext=@ext ");
sql.setParam("type", data.getType())
.setParam("seniorType", data.getSeniorType())
.setParam("userId", data.getUserId())
.setParam("effectiveTime", data.getEffectiveTime())
.setParam("expireTime", data.getExpireTime())
.setParam("creator", data.getCreator())
.setParam("ext", data.getExt());
singleDao.execute(sql);
- 原因
因为之前的参数都是基本类型,而新添加的字段ext
类型是JSONObject
,导致在解析ext
字段映射的时候的时候走到了else
流程里。在前面通过sql语句生成NutzSql
对象时未设置entity
属性。导致下面这个地方会报空指针错误。
- 建议
这个问题最后算是解决了,通过在Sqls.create
之后执行sql.setEntity
。但是排查问题花了挺长时间,而且是在输出日志的这个地方报错了,日志里看不到有用的信息。希望在字段映射这里做一个判断,在抛出异常增加一些"has not set entity properly"
的错误信息等,提示强制设置entity
。