NutzCN Logo
精华 关于使用自定义sql未设置Entity时可能会抛NPE异常的建议
发布于 1566天前 作者 zhenpeng0hou 2477 次浏览 复制 上一个帖子 下一个帖子
标签: nutzwk
  1. 我们项目中之前一直使用自定义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);
  1. 原因
    因为之前的参数都是基本类型,而新添加的字段ext类型是JSONObject,导致在解析ext字段映射的时候的时候走到了else流程里。在前面通过sql语句生成NutzSql对象时未设置entity属性。导致下面这个地方会报空指针错误。
    异常情况
  2. 建议
    这个问题最后算是解决了,通过在Sqls.create之后执行 sql.setEntity。但是排查问题花了挺长时间,而且是在输出日志的这个地方报错了,日志里看不到有用的信息。希望在字段映射这里做一个判断,在抛出异常增加一些 "has not set entity properly" 的错误信息等,提示强制设置entity
2 回复

这路径还挺特殊的。。。

是比较特殊,而且之前很长一段时间这么用也都正常,出了问题一下也想不到是因为entity没设置导致的

添加回复
请先登陆
回到顶部