MyBatis查询无记录时的返回值问题
目录
- MyBatis查询无记录的返回值
- 在MyBatis 3.4.1下
- 查询无结果时的返回值报错问题
- mybatis的查询无结果时报错
MyBatis查询无记录的返回值
在MyBatis 3.4.1下
如果Dao的返回值是实体,则select查询无记录时返回null。容易报空指针异常!
Notice findById();
如果Dao的返回值是List,则select查询无记录是返回的是[],也就是空数组,
而不是null。所以这时候判空需要用CollectionUtils.isNotEmpty(),而不是"==null"
ListfindById();
查询无结果时的返回值报错问题
mybatis的查询无结果时报错
(方法名)queryAllNumFromCart attempted to return null from a method with a primitive return type (long)的问题queryAllNumFromCart此方法在mapper.xml中是这样定义的:
select sum(num) from t_cart where user_id = #{userId}
在mapper中是这样定义的:
long queryAllNumFromCart(Integer userId); //返回值为long类型
调用后运行报错:
java.lang.RuntimeException: org.apache.ibatis.binding.BindingException: Mapper method 'com.egoo.mapper.CartMapper.queryAllNumFromCart attempted to return null from a method with a primitive return type (long).主要报错原因的语句为:
org.apache.ibatis.binding.BindingException: Mapper method 'com.egoo.mapper.CartMapper.queryAllNumFromCart attempted to return null from a method with a primitive return type (long).
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:94)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy16.queryAllNumFromCart(Unknown Source)
at com.egoo.service.impl.CartServiceImpl.getTotalFromMysql(CartServiceImpl.java:370)
at com.alibaba.dubbo.common.bytecode.Wrapper2.invokeMethod(Wrapper2.java)
at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47)
at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:76)
at com.alibaba.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:52)
at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56)
at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:62)
......
(method)attempted to return null from a method with a primitive return type (long)此方法企图从定义了原始的返回类型(long)的方法中返回null ,显而易见,此处的返回值类型有问题。网上搜了之后发现是mybais的返回值为包装类,且sql语句的定义的返回值类型为:java.lang.Long。查询数据库为空后,会返回null而不是0L,所以此处需要将方法的返回值类型改为包装类java.lang.Long:
//Long queryAllNumFromCart(Integer userId); //当查询到的数据为0条时,会返回null,而不是0,可以改为包装类
或者在sql语句中加入IFNULL(expr1,expr2)的函数进行判断:
select IFNULL(sum(num),0) from t_cart where user_id = 1
建议还是使用修改sql语句的方式。
【MyBatis查询无记录时的返回值问题】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- MyBatis框架零基础快速入门案例详解
- MyBatisPlus学习笔记
- 带码农《手写Mybatis》进度3(实现映射器的注册和使用)
- SQL|关系数据库标准语言SQL01
- 聊聊在获取方法参数名方面|聊聊在获取方法参数名方面,Spring真的就比Mybatis强?
- 三高Mysql - Mysql索引和查询优化(偏理论部分)
- 详细聊一聊mysql的树形结构存储以及查询
- 【Python】列表嵌套和列表嵌套的数据查询
- 代码生成器|代码生成器(MyBatis-Plus代码生成自定义模版)
- Mybatis-Plus|实例(MyBatis-Plus自定义分页查询)