mapper method attempted to return null from a method with a primitive return type (int)

一、场景和背景

工具:mybatis + pgsql

dao代码:

int selectMaxAgeBySex(String sex); 查询性别是女生的最大年龄

sql:

<select id = "selectMaxAgeBySex" resultType="int">
	select max(age) from user where sex = '女';
</select>

二、错误原因

如果数据表user中没有性别是女的用户数据,那么pgsql返回的函数max值是null,此时把null赋值给了resultType=“int”,报错信息:

mapper method attempted to return null from a method with a primitive return type (int)

三、解决

pgsql数据库的max返回值有两种,null和数值。
当返回的数据是nu l l空对象时,即意味着把null赋值给int。如果用程序实现将会报空指针异常,例如:

package com.test.boke;

public class TestJava {
	public static void main(String[] args) {
		Integer integer = null;
		int num = integer;
		System.out.println("num = " + num);
	}
}

console输出:
Exception in thread "main" java.lang.NullPointerException
at com.test.boke.TestJava.main(TestJava.java:6)

所以不可以使用resultType="int"作为返回类型。正确的代码是:
dao代码:

Integer selectMaxAgeBySex(String sex); 查询性别是女生的最大年龄

sql:

<select id = "selectMaxAgeBySex" resultType="java.lang.Integer">
	select max(age) from user where sex = '女';
</select>
在Java中,当一个方法被声明为返回基本类型`int`时,如果尝试从该方法中返回`null`,就会触发错误“attempted to return null from a method with a primitive return type (int)”。这是因为基本类型`int`不能持有`null`值,其默认值为`0`。而`Integer`是`int`的包装类,它可以持有`null`值[^1]。 ### 错误原因 此错误通常出现在使用MyBatis等ORM框架进行数据库操作时。例如,在Mapper接口中定义了一个返回类型为`int`的方法,但在对应的SQL语句执行后没有查询到任何数据,导致结果为`null`。由于`int`类型无法接受`null`值,因此会抛出异常[^2]。 ### 解决方案 #### 1. 修改返回类型为 `Integer` 将方法的返回类型从`int`改为`Integer`是最直接的解决办法。这样可以确保方法能够正确处理`null`值的情况。例如: ```java public Integer getSomeValue(); ``` #### 2. 在SQL中提供默认值 可以在SQL语句中使用`COALESCE`函数来提供一个默认值,以防止返回`null`。例如,在MyBatis的XML配置文件中,可以修改SQL如下: ```xml <select id="getSomeValue" resultType="int"> SELECT COALESCE(some_column, 0) FROM some_table WHERE some_condition </select> ``` 这样即使查询不到数据,也会返回`0`而不是`null`,从而避免了错误[^3]。 #### 3. 使用Optional类 对于Java 8及以上版本,可以考虑使用`Optional<Integer>`作为返回类型,以更优雅地处理可能为`null`的情况。例如: ```java public Optional<Integer> getSomeValue(); ``` 然后在调用该方法时,可以通过`Optional`提供的方法来安全地处理可能不存在的值。 #### 4. 检查并处理空结果 在业务逻辑中增加对空结果的检查,如果检测到`null`,则手动设置一个合理的默认值。这需要在服务层或控制器层进行额外的判断和处理。 ### 示例代码 以下是一个具体的示例,展示如何通过修改返回类型和SQL语句来解决问题: ```java // Mapper接口 public interface GitCommitStatisticsMapper { // 改为返回Integer类型 Integer calShowTimeGitLabCommitLines(); } ``` 对应的XML配置文件中的SQL语句也可以添加默认值: ```xml <select id="calShowTimeGitLabCommitLines" resultType="int"> SELECT COALESCE(commit_lines, 0) FROM git_commit_statistics WHERE some_condition </select> ``` 通过这些方法,可以有效地避免因试图从返回基本类型`int`的方法中返回`null`而导致的错误。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值