druid 日志输出id null 但是仍可以更新成功

[java代码]

SysCron4j cron4j = SysCron4j.dao.findById(467356983113023488L);

//cron4j.setId(cron4j.getId());

cron4j.setName("123456").setUpdateTime(DateUtils.now()).update();

[druid 日志输出]

[DEBUG] {conn-10010, pstmt-20020} executed. select * from `sys_cron4j` where `id` = 467356983113023488 (druid.sql.Statement.java:137) 

[DEBUG] {conn-10010, pstmt-20021} executed. update `sys_cron4j` set `name` = '123456', `updateTime` = '2019-07-14'

where `id` = null (druid.sql.Statement.java:137) 

问题描述:先通过id查询,再更新druid 日志 输出的sql id为空,放开java代码第二行就有id输出了,这是为啥?求教,谢谢!

评论区

JFinal

2019-07-14 14:45

将日志中的 sql 放在数据库客户端执行试一下:
update `sys_cron4j` set `name` = '123456', `updateTime` = '2019-07-14' where `id` = null

jfinal 的数据库操作仅仅是将你的 sql 与 para 直接扔给了 JDBC,如果 JDBC 认可这条 sql 那就是可以执行的,一般来说 JDBC 认可那么数据库自带的客户端也会认可

所以我建议上面将 sql 放客户端试一下

JFinal

2019-07-14 14:46

补充一下:
从你的贴子内容来看应该是不合理的,因为 id = null 这个条件在逻辑上是错误的,不会有人设计 id 可为 null 的表结构

此外,判断字段为 null 的正确用法是 id is null , 而不是 id = null

kele679

2019-07-14 15:45

可能我没表达清楚:我的逻辑是先findById 查询到一个对象,再update操作,Log4jFilter 配置好之后,日志输出的内容 `id` = null ,其实update操作是能执行成功的,只是sql打印的时候id为啥是null有点不明白, update之前我先getId 再setId 日志就能正常输入id了。

kele679

2019-07-14 15:46

id肯定是有值的,不然数据库也不会更新成功,只是 日志为啥输出的是 null 呢

JFinal

2019-07-14 15:53

@kele679 很可能是 druid 日志输出的 bug

kele679

2019-07-14 16:51

[ERROR] slow sql 14 millis. update `sys_user` set `email` = ? where `id` = ?["AAAA",null] (com.alibaba.druid.filter.stat.StatFilter.java:474) 中括号里面的参数是jfinal处理的吗?

JFinal

2019-07-14 19:28

@kele679 不是 jfinal 处理的,目前的 jfinal 版本不支持输出参数

kele679

2019-07-15 17:52

原因找到了,mysql字段类型 bigint(20) unsigned 对应java中Long,把unsigned 无符号去掉就行了。

热门反馈

扫码入社