MyBatis查詢無記錄時的返回值問題
MyBatis查詢無記錄的返回值
在MyBatis 3.4.1下
如果Dao的返回值是實體,則select查詢無記錄時返回null。容易報空指針異常!
Notice findById();
如果Dao的返回值是List,則select查詢無記錄是返回的是[],也就是空數組,
而不是null。所以這時候判空需要用CollectionUtils.isNotEmpty(),而不是"==null"
List<Notice> findById();
查詢無結果時的返回值報錯問題
mybatis的查詢無結果時報錯
(方法名)queryAllNumFromCart attempted to return null from a method with a primitive return type (long)的問題
queryAllNumFromCart此方法在mapper.xml中是這樣定義的:
<select id="queryAllNumFromCart" parameterType="java.lang.Integer" resultType="java.lang.Long"> select sum(num) from t_cart where user_id = #{userId} </select>
在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語句的方式。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 解決Mybatis映射文件mapper.xml中的註釋問題
- mybatis 如何通過resultMap 返回long
- mybatis相同的sql查詢第二次查不出結果問題
- 詳解Mybatis內的mapper方法為何不能重載
- 原理分析Java Mybatis中的Mapper