mybatis long 类型返回为null报异常

 Mapper method 'com.mpn.dao.TWeatherMapper.avgWeatherTemperature attempted to return null from a method with a primitive return type (long).
  <select id="avgWeatherTemperature" resultType="java.lang.Long" parameterType="java.lang.String" >
        SELECT IFNULL(AVG(WeatherTemperature),0) AS OrderAverage FROM t_weather WHERE WeatherDate= #{date,jdbcType=VARCHAR};
  </select>
  
   <select id="sumWeatherRainfall" resultType="java.lang.Long" parameterType="java.lang.String" >
        SELECT SUM(WeatherTemperature) AS OrderAverage FROM t_weather WHERE WeatherDate= #{date,jdbcType=VARCHAR};
  
  </select>
  
   <select id="avghumidity" resultType="java.lang.Long" parameterType="java.lang.String" >
        SELECT IFNULL(AVG(WeatherHumidity),0) AS OrderAverage FROM t_weather WHERE WeatherDate= #{date,jdbcType=VARCHAR};
  </select>

由于返回为空long中没有此类型所以抛异常,改为

 <!-- 根据日期来进行计算平局值与 -->
   <select id="avgWeatherTemperature" resultType="java.lang.Long" parameterType="java.lang.String" >
        SELECT IFNULL(AVG(WeatherTemperature),0) AS OrderAverage FROM t_weather WHERE WeatherDate= #{date,jdbcType=VARCHAR};
  </select>
  
   <select id="sumWeatherRainfall" resultType="java.lang.Long" parameterType="java.lang.String" >
        SELECT IFNULL(SUM(WeatherTemperature),0) AS OrderAverage FROM t_weather WHERE WeatherDate= #{date,jdbcType=VARCHAR};
  
  </select>
  
   <select id="avghumidity" resultType="java.lang.Long" parameterType="java.lang.String" >
        SELECT IFNULL(AVG(WeatherHumidity),0) AS OrderAverage FROM t_weather WHERE WeatherDate= #{date,jdbcType=VARCHAR};
  </select>

用IFNULL来进行判断

<think>好的,我现在需要帮用户解决在MyBatis中将数据库的numeric类型字段转换为Java的Long类型的问题。首先,我得确认用户的具体需求。数据库中的numeric类型通常用于存储精确数值,可能包括整数或小数,但用户想将其转换为Java的Long,这意味着目标字段应该是整数类型。 首先,我应该考虑MyBatis类型处理器。MyBatis有内置的类型处理器,比如对于数据库的NUMERIC类型,默认可能会映射为java.math.BigDecimal,特别是当字段包含小数部分时。但如果数据库中的numeric字段实际上是整数,比如NUMERIC(18,0),这时候直接映射为Long可能更合适,因为BigDecimal处理起来比较麻烦,而Long更高效。 所以用户可能需要自定义类型处理器,或者通过配置resultMap来指定类型。需要检查MyBatis的文档,看看是否有内置的Long类型处理器。例如,如果数据库字段是整数,且长度不超过Long的范围,那么直接使用jdbcType=NUMERIC和javaType=Long是否可行?或者是否需要显式配置? 另外,可能用户遇到了类型转换异常,比如MyBatis尝试将NUMERIC转换为BigDecimal,而用户实体类中定义的是Long类型,导致类型不匹配。这时候需要自定义TypeHandler来处理这个转换。 接下来,我需要给出具体的示例。例如,在resultMap中指定字段的jdbcType和javaType,或者在MyBatis配置文件中注册自定义的TypeHandler。同时,需要提醒用户注意数值范围,确保数据库中的值不超过Long的最大值,否则会发生溢出错误。 另外,最佳实践部分需要考虑使用场景,如果字段确实是整数且范围合适,推荐使用Long;如果可能有小数部分或数值很大,可能需要使用BigDecimal。此外,性能方面,Long比BigDecimal更高效,所以如果适用的话,优先使用Long。 可能还需要提到在实体类中正确声明字段类型,以及在XML映射文件中正确配置jdbcType。例如,在resultMap中使用column="numeric_column" property="longProperty" jdbcType="NUMERIC" javaType="java.lang.Long"。 如果MyBatis的内置处理器不支持NUMERIC到Long的转换,可能需要编写自定义的TypeHandler,继承BaseTypeHandler,并重写相关方法,将ResultSet获取的BigDecimal转换为Long,检查是否为空和小数部分是否为0,然后转换为Long值。 最后,总结步骤和注意事项,确保用户能够正确配置并避免常见错误,比如数值溢出或小数部分处理不当的问题。</think>在MyBatis中将数据库的`NUMERIC`类型字段转换为Java的`Long`类型,可以通过以下步骤实现: --- ### 1. 确认数据库字段定义 首先确保数据库的`NUMERIC`字段实际存储的是整数(如`NUMERIC(18,0)`),且数值范围在`Long`类型的承载范围内($-9,223,372,036,854,775,808$ 到 $9,223,372,036,854,775,807$)。 --- ### 2. 实体类定义 在Java实体类中直接使用`Long`类型字段: ```java public class YourEntity { private Long numericField; // 直接声明为Long类型 // getter/setter省略 } ``` --- ### 3. MyBatis映射配置 #### 方案一:隐式类型转换(推荐) 如果数据库字段为整数型`NUMERIC`(如`NUMERIC(18,0)`),MyBatis默认会通过`BigDecimal`到`Long`的隐式转换完成映射[^1],无需额外配置: ```xml <resultMap id="baseResultMap" type="YourEntity"> <result column="numeric_column" property="numericField"/> </resultMap> ``` #### 方案二:显式类型处理器 若需处理特殊场景(如含小数字段强制取整),可自定义`TypeHandler`: ```java public class NumericToLongTypeHandler extends BaseTypeHandler<Long> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType) { ps.setBigDecimal(i, new BigDecimal(parameter)); } @Override public Long getNullableResult(ResultSet rs, String columnName) throws SQLException { BigDecimal value = rs.getBigDecimal(columnName); return value != null ? value.longValueExact() : null; } // 其他重写方法省略... } ``` 在MyBatis配置中注册: ```xml <typeHandlers> <typeHandler handler="com.example.NumericToLongTypeHandler" javaType="java.lang.Long" jdbcType="NUMERIC"/> </typeHandlers> ``` --- ### 最佳实践 1. **数值范围校验**:确保数据库数值不超过`Long.MAX_VALUE`($9,223,372,036,854,775,807$) 2. **避免小数字段**:若数据库字段含小数(如`NUMERIC(18,2)`),强制转换会丢失精度,建议改用`BigDecimal` 3. **性能优化**:`Long`类型操作效率高于`BigDecimal`,适合高频访问的整数字段[^2] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值