关于hibernate 报 java.lang.IllegalArgumentException

本文详细解析了在使用JSP页面处理AskBuy.del_tag字段时遇到的Null值赋给原始类型setter导致的报错问题,解释了原因并提供了解决方案。
JSP页面报错:
Null value was assigned to a property of primitive type setter of com.founder.common.pojo.AskBuy.del_tag



控制台报错信息:
 Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)



原因:因为数据库定义了del_tag为bit型,而且查询时数据为null,hibernate对应的类型是boolean,boolean不能为空,给del_tag字段添加个0或者1就行了
这个错误信息: ``` Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String ``` 说明你在执行数据库查询时,试图将 `java.util.Date` 类型与 `String` 类型进行比较,而这种比较是不合法的,Java 不允许不同类型的对象直接比较,尤其是在使用如 Hibernate、MyBatis 等 ORM 框架时,或者在使用 `JPA` 查询时。 --- ## 🔍 问题原因详解 ### ✅ 你遇到的典型场景可能是: ### 场景1:在 **MyBatis XML 映射文件**中,你将 `Date` 类型参数与数据库中的 `VARCHAR` 类型字段进行了比较。 例如: ```xml <select id="selectByDate" resultType="..."> SELECT * FROM my_table WHERE create_time = #{dateParam} </select> ``` 而 `create_time` 是 `VARCHAR` 类型,`#{dateParam}` 是 `java.util.Date` 类型。这时就会错。 --- ### 场景2:在 **HQL(Hibernate Query Language)** 或 **Spring Data JPA** 查询中,字段类型是 `String`,但你传入的是 `Date`。 ```java @Query("SELECT e FROM Entity e WHERE e.dateField = ?1") List<Entity> findByDate(Date date); ``` 而 `dateField` 是数据库中的 `VARCHAR` 字段,映射为 Java 中的 `String` 类型,这时就会类型不匹配。 --- ### 场景3:在 **Java 代码中直接比较 `Date` 和 `String`**,例如: ```java if (myDate.equals(myString)) { ... } ``` 这种比较在运行时也会抛出异常。 --- ## ✅ 解决方案 ### ✅ 方案1:确保类型一致(推荐) 将 `Date` 转换为 `String`,再传入查询参数。 #### Java代码示例: ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = sdf.format(dateParam); ``` #### XML 中使用: ```xml <select id="selectByDate" resultType="..."> SELECT * FROM my_table WHERE create_time = #{dateString} </select> ``` --- ### ✅ 方案2:修改数据库字段类型为 `DATE` 或 `DATETIME` 如果你的字段是 `VARCHAR` 类型但存储的是日期字符串,建议改为 `DATE`、`DATETIME` 或 `TIMESTAMP` 类型。 例如: ```sql ALTER TABLE my_table MODIFY create_time DATETIME; ``` 然后在 Java 中映射为 `java.util.Date` 类型即可。 --- ### ✅ 方案3:在查询时将字段转换为时间类型(MySQL 示例) 如果你不能修改字段类型,可以在 SQL 中进行类型转换: ```xml <select id="selectByDate" resultType="..."> SELECT * FROM my_table WHERE STR_TO_DATE(create_time, &#39;%Y-%m-%d %H:%i:%s&#39;) > #{dateParam} </select> ``` --- ## ✅ 总结 | 问题 | 原因 | 解决方案 | |------|------|----------| | `invalid comparison: Date and String` | 数据库字段类型与 Java 参数类型不匹配 | 1. 修改字段类型<br>2. 转换 Java 参数为 String<br>3. SQL 中转换字段为 Date | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值