在今天写一个统计数据的mapper时,在测试的时候尽然报错了,报错原因如下:
ERROR m.e.handler.GlobalExceptionHandler -
nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database.
Cause: java.lang.NullPointerException
### Cause: java.lang.NullPointerException
org.mybatis.spring.MyBatisSystemException:
nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database.
Cause: java.lang.NullPointerException
### Cause: java.lang.NullPointerException
这个一看就是因为空指正Error querying database. Cause: java.lang.NullPointerException
这个的原因,下面列出我mapper层的sql
@Select({
"<script>",
"<choose>",
"<when Test='emailDTO.caseId==3'>",
"SELECT DISTINCT u.`username`,d.`name` dept_name,u.`phone`,SUM(IF(nu.`option_id`=0,0,1))/COUNT(nu.`user_id`) completions,nu.`view_time`,nu.`update_time` feedback_time FROM xiaoyun_notify_user nu\n",
"</when>",
"<when Test='emailDTO.caseId==1'>",
"SELECT DISTINCT u.`username`,d.`name` dept_name,u.`phone`,nu.`view_time`, nu.update_time feedback_time,o.`option_content` FROM xiaoyun_notify_user nu",
"</when>",
"<when Test='emailDTO.caseId==2'>",
"SELECT DISTINCT u.`username`,d.`name` dept_name,u.`phone`,nu.`view_time`, nu.update_time feedback_time,nu.`chains_content` FROM xiaoyun_notify_user nu",
"</when>",
"<otherwise>",
"SELECT DISTINCT u.`username`,d.`name` dept_name,u.`phone`,nu.`view_time`, nu.update_time feedback_time,o.`option_content` FROM xiaoyun_notify_user nu",
"</otherwise>",
"</choose>",
"LEFT JOIN xiaoyun_option o ON nu.`option_id`=o.`id`\n",
"LEFT JOIN xiaoyun_user u ON nu.`user_id`=u.`id`\n",
"LEFT JOIN xiaoyun_dept d ON nu.`dept_id`=d.`id`\n",
"WHERE nu.`notify_id`=#{emailDTO.id} \n",
"<if Test='userId!=null'>",
"and nu.`create_by`=#{userId}",
"</if>",
"GROUP BY nu.`user_id`\n",
"ORDER BY nu.`dept_id`",
"</script>"
})
其实这个是不建议这样写的,因为这样写在后期也是不容易维护的,而且维护人员在维护的时候也会吐槽,这写的是什么鬼……
我们现在来看为什么报这个错误:
我看了快十来分钟也没检查出啥问题,明明感觉sql
写的没问题啊
忽然,发现<if></if>
标签中的 test 是大写的,当时认为mybatis其内部或许有大小写转换的,但在将Test
改为test
后,发现可以运行,所以,在mapper层中我们要注意这些细节问题
总结:
其实写的多了我们就会发现,对于Error querying database. 这样的错误,很多情况下都是我们没有仔细写而引起的书写错误,在以后发现此类问题,我们多查看检查问题,肯定可以找出问题的。