iBatis java.lang.RuntimeException: Error setting property

[b]系统运行时报如下错误:[/b]
[java.sql.PreparedStatement]org.springframework.jdbc.UncategorizedSQLException: 

SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error

code [0];
--- The error occurred in com/windowclick/abb/ibatis/apkProduct.xml.
--- The error occurred while applying a result map.
--- Check the getApkProductDtoBySearch-AutoResultMap.
--- The error happened while setting a property on the result object.
--- Cause: java.lang.RuntimeException: Error setting property 'setShow_push_ad' of

'com.windowclick.abb.dto.ApkProductDto@38daa6a6'. Cause:

java.lang.IllegalArgumentException; nested exception is

com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in com/windowclick/abb/ibatis/apkProduct.xml.


一看问题,以为是ApkProductDto对象中没有show_push_ad属性,被同事修改了,但实际正常,通过检查,发现[color=red]数据库中此列数据为空,但实际数据库设置此字段属性为INT类型,默认值为0,当查询转换时,不能把null转换成int类型,如此异常产生[/color],如果实际应用中确实有空的数据,但需转换成其他类型,可以用ifnull(字段名,默认值)进行判断设置默认值
### 问题分析 `java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String` 异常的根本原因是,在 MyBatis 的映射文件中,尝试将 `java.time.LocalDateTime` 类型与 `java.lang.String` 类型进行比较。这种跨类型的比较在 Java 和 MyBatis 中均不受支持。 以下是可能导致该问题的具体场景及其解决方案: --- ### 数据库字段类型与实体类属性类型一致性验证 确保数据库中的字段类型(如 `DATETIME` 或 `TIMESTAMP`)与其对应的实体类属性类型一致。例如,如果数据库字段是 `DATETIME` 类型,则实体类中的对应属性应为 `LocalDateTime` 而非 `String`[^2]。 #### 示例代码 ```java @Entity public class User { @Column(name = "create_time", columnDefinition = "DATETIME") private LocalDateTime createTime; } ``` --- ### 检查 MyBatis 映射文件中的条件表达式 在 MyBatis 的 XML 文件中,避免对 `LocalDateTime` 类型的参数执行非法比较操作。常见的错误是在 `<if>` 标签中使用类似于 `createTime != ''` 的逻辑。由于 `createTime` 是 `LocalDateTime` 类型,而 `''` 是字符串类型,因此会产生异常。 #### 错误写法 ```xml <if test="createTime != null and createTime != ''"> AND create_time = #{createTime} </if> ``` #### 正确写法 仅检查 `createTime` 是否为 `null` 即可: ```xml <if test="createTime != null"> AND create_time = #{createTime} </if> ``` --- ### 参数传递的一致性 当调用 MyBatis 方法时,确保传入的参数类型与预期类型完全匹配。如果方法签名期望接收 `LocalDateTime` 类型的参数,则不应传递 `String` 类型的数据[^3]。 #### 示例代码 ```java // 错误示例:传递 String 类型 userMapper.findByCreateTime("2023-10-01T12:00:00"); // 正确示例:传递 LocalDateTime 类型 userMapper.findByCreateTime(LocalDateTime.of(2023, 10, 1, 12, 0)); ``` --- ### 使用正确的类型转换机制 如果确实需要基于字符串形式的时间值构建查询条件,可以在应用程序层面完成类型转换后再将其作为参数传递给 MyBatis。推荐使用 `DateTimeFormatter` 来解析字符串并生成 `LocalDateTime` 实例[^4]。 #### 示例代码 ```java import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class TimeUtil { public static LocalDateTime parse(String timeStr) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); return LocalDateTime.parse(timeStr, formatter); } } // 调用示例 LocalDateTime dateTime = TimeUtil.parse("2023-10-01T12:00:00"); userMapper.findByCreateTime(dateTime); ``` --- ### 版本兼容性注意事项 某些版本的 MyBatis 可能存在针对时间类型处理的 Bug。建议升级到最新稳定版以获得更好的支持和修复[^5]。当前推荐使用的版本为 **MyBatis 3.5.x** 或更高版本。 #### Maven 配置示例 ```xml <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> ``` --- ### 总结 通过以上措施可以有效解决 `java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String` 异常问题。核心在于保持数据类型的一致性和避免非法的跨类型比较。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值