Hibernate文字与格式化字符串不匹配错误

简介: 今天这个呢,主要是在使用Hibernate的时候遇到过这个问题,想着别人可能也会遇到这个问题,那么就简单的来记录一下问题的产生以及解决方案。
今天这个呢,主要是在使用Hibernate的时候遇到过这个问题,想着别人可能也会遇到这个问题,那么就简单的来记录一下问题的产生以及解决方案。

事情的起因是做一个需求,然后测试反馈说这个有个功能报错阻断流程了,让抽时间排查一下,我一开始以为是数据问题,后来我自己环境上尝试了一下,也的确是重现出来这个问题了,而且呢,问题也是相当炸裂的,至于为什么说是相当的炸裂呢?这个后续会说,等到谈到问题的原因时,大家也就自然明白这个问题到时候是有多么的可笑了。
先来简单看一下这个问题的堆栈信息吧,这个堆栈信息不难看出是因为格式不匹配造成的,那么究竟是什么格式呢?之前有了解过的同学可能知道,这种错误最常见的不就是字符串与日期之间转换异常造成的错误吗。而且这个提示也是比较明显的,就是字符串格式转换的有问题,既然知道了可能是时间格式的问题,那么下面就开始自己本地Debug了,尽量定位到离目标代码最近的几行代码中。

Caused by: java.sql.BatchUpdateException: ORA-01861: 文字与格式字符串不匹配

    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:12296)
    at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:246)
    at weblogic.jdbc.wrapper.PreparedStatement.executeBatch(PreparedStatement.java:216)
    at com.p6spy.engine.logging.P6LogPreparedStatement.executeBatch(P6LogPreparedStatement.java:329)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
    ... 112 more

本地经过Debug之后,问题是在经过查询方法之后才开始报错抛出了这个异常堆栈信息,这时候本人就很懵逼了,这个明显是时间格式不匹配的问题,怎么会在一个find查询方法的时候报错呢?

然后我去问了一下Chatgpt,它给出的答案是这个样子的,跟我预想的基本一致,时间格式的问题。

  • 检查插入的日期格式是否与数据库的日期格式一致。如果不一致,则需要将插入的日期格式转换为与数据库一致的格式。
  • 检查数据库中日期字段是否为 null。如果是 null,则需要在代码中处理 null 值。
  • 检查数据中是否有其他类型的错误,比如字符串转换成数字等。
  • 检查是否使用了正确的日期格式化模式。可以查看 Oracle 的日期格式化模式。
  • 检查是否正确设置了数据库的时区,以及是否需要转换时区。

image.png

看到这里还是没想出来具体为什么会在查询的时候报错了,然后错误日志又翻了翻,上面有一行是这么描述的,说是session update的时候更新有问题,那么这么描述我就理解了,还是实体的某个字段更新有问题,才导致了这种错误。

接下来继续排查问题,这次我就着重看一下那些时间类型的字段有没有什么问题,看了一大圈,没有发现有什么异常啊,这时又很苦恼了,不知如何下手。然后我就想着再Debug看一眼更新之前的参数值哪里有问题,这次呢,终于发现了问题。我看到有个字符串类型的时间,但是这种显然不应该是字符串呀。我就去数据库看了一下表结构,发现这个确实不是字符串类型,而是时间类型,那么这时就定位到了,一个时间类型的字段,你用字符串去赋值,你不报错谁报错呀。关键是实体里确实是字符串类型,有些许的尴尬,排查到了问题我就把字符串类型的时间改了一下,运行程序发现问题解决了,字段赋值正常,问题解决。

这种小的问题,有时候才是最折磨人的,因为一般的惯性思维是想着不会犯这种低级错误的,没想到还是有人这么写了,那么这就很尴尬了,问题解决了。
目录
相关文章
|
3月前
|
开发框架 .NET 程序员
C# 去掉字符串最后一个字符的 4 种方法
在实际业务中,我们经常会遇到在循环中拼接字符串的场景,循环结束之后拼接得到的字符串的最后一个字符往往需要去掉,看看 C# 提供了哪4种方法可以高效去掉字符串的最后一个字符
323 0
|
2月前
|
Python
如何使用正则表达式来匹配特定格式的电话号码?
如何使用正则表达式来匹配特定格式的电话号码?
|
C++
VS Code识别编辑规范,ESlint规则,VS Code保存去掉自动加分号、逗号、双引号
书写规范是非常重要的,除了统一,还要简洁。 1、VS Code识别编辑规范 在项目根目录新建.editorconfig文件,加入设置:
936 0
|
Java 数据库连接 mybatis
mybatis异常 :元素内容必须由格式正确的字符数据或标记组成。
今天同事写一个查询接口的时候,出错:元素内容必须由格式正确的字符数据或标记组成。   错误原因:mybatis查询的时候,需要用到运算符 小于号:< 和  大于号: >,在mybatis配置文件里面,这种会被认为是标签,所以解析错误 错误事例: select from t...
1844 0
|
7月前
如何去掉字符串中文括号及其内部的内容三种方式
如何去掉字符串中文括号及其内部的内容三种方式
241 0
|
7月前
|
JavaScript 前端开发 物联网
正则表达式的用法(判断是否为手机号格式)
正则表达式的用法(判断是否为手机号格式)
766 1
|
编译器 程序员 C++
C++ 中的原始字符串文字及C++ 中的字符串数组(1-2)
在 C++ 中,为了转义像“\n”这样的字符,我们使用一个额外的“\”。从 C++ 11 开始,我们可以使用未处理转义字符(如 \n \t 或 \” )的原始字符串。原始字符串的语法是文字以 R”( 开头,以 )” 结尾。
210 0
|
前端开发
解决多行文本换行省略显示失效的问题
解决多行文本换行省略显示失效的问题
479 0
解决多行文本换行省略显示失效的问题
如何去除枚举类型字段必须要有注释说明的警告!
如何去除枚举类型字段必须要有注释说明的警告!
408 0
如何去除枚举类型字段必须要有注释说明的警告!