今天在使用mybatis和oracle数据库执行操作时,莫名其妙的报错:
严重: Servlet.service() for servlet [spring] in context with path [/crm] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.NullPointerException
### The error may exist in file [F:\apache-tomcat-9.0.6\webapps\crm\WEB-INF\classes\mapper\crm\order\CrmShopOrderMapper.xml]
### The error may involve CrmShopOrder.findShopOrderAnalysis
### The error occurred while handling results
### SQL: SELECT A.ORDER_NUM, A.MONTHS, A.PRODUCTCODE, A.PRODUCTNAME, A.CATEGORY_NAME, A.TOTALAMOUNT, B.TOTALAMOUNT_SUM, B.ORDER_NUM_COUNT FROM ( SELECT COUNT(A.MERGE_CODE) ORDER_NUM, TO_CHAR(A.CREATED_TIME,'MM') MONTHS, B.PRODUCTCODE, B.PRODUCTNAME, D.CATEGORY_NAME, A.TOTALAMOUNT FROM MALL_ORDER A LEFT JOIN MALL_ORDER_PRODUCT B ON B.ORDER_ID = A.ID LEFT JOIN MALL_PRODUCT C ON C.ID = B.PRODUCT_ID LEFT JOIN MALL_CATEGORY D ON D.ID = C.MALLCATEGORY_ID WHERE A.CREATED_TIME BETWEEN TO_DATE(?, 'yyyy-mm-dd hh24:mi:ss') AND TO_DATE(?, 'yyyy-mm-dd hh24:mi:ss') AND A.STATUS = 1 GROUP BY A.CREATED_TIME,B.PRODUCTCODE,A.TOTALAMOUNT,B.PRODUCTNAME,D.CATEGORY_NAME ) A LEFT JOIN ( SELECT SUM(TOTALAMOUNT) TOTALAMOUNT_SUM, COUNT(ORDER_NUM) ORDER_NUM_COUNT, A.MONTHS FROM ( SELECT COUNT(A.MERGE_CODE) ORDER_NUM, TO_CHAR(A.CREATED_TIME,'MM') MONTHS, B.PRODUCTCODE PRODUCTCODE, B.PRODUCTNAME PRODUCTNAME, D.CATEGORY_NAME CATEGORY_NAME, A.TOTALAMOUNT TOTALAMOUNT FROM MALL_ORDER A LEFT JOIN MALL_ORDER_PRODUCT B ON B.ORDER_ID = A.ID LEFT JOIN MALL_PRODUCT C ON C.ID = B.PRODUCT_ID LEFT JOIN MALL_CATEGORY D ON D.ID = C.MALLCATEGORY_ID WHERE A.CREATED_TIME BETWEEN TO_DATE(?, 'yyyy-mm-dd hh24:mi:ss') AND TO_DATE(?, 'yyyy-mm-dd hh24:mi:ss') AND A.STATUS = 1 GROUP BY A.CREATED_TIME,B.PRODUCTCODE,A.TOTALAMOU
经过排查,发现有一个数据库字段是DOUBLE类型,而mybatis的select语句中参数类型和结果类型都是map,不是返回实体,由于数据库底层的原因会导出报错NullPointerException。
解决方法:在sql语句中对DOUBLE类型的字段进行类型转换,转换为number类型;或者修改数据库该字段的类型为number类型