关于 java.sql.SQLException: Bad format for Date错误的解决方法

本文解决了一个在数据库操作中遇到的错误问题,主要是由于ResultSet在获取值时的顺序与数据库表中列的值顺序不匹配导致的。通过正确地按照数据库列的序号顺序获取值并赋值给对应的JavaBean属性,可以有效避免此类错误。文章详细解释了错误原因及解决方案,旨在帮助开发者避免在类似场景下犯同样的错误。
出现此类错误纠结我很久,今天终于有一个解决方法:原来是因为ResultSet在取值时是有顺序的,应该对应该数据库表中列的值。
如:
user.setUserId(rs.getInt(1));
user.setUserName(rs.getString(2));
user.setPassword(rs.getString(3));
user.setTrueName(rs.getString(4));
user.setPhone(rs.getString(5));
user.setDesc(rs.getString(6));
user.setQQ(rs.getString(7));
user.setEmail(rs.getString(8));
user.setStatus(rs.getInt(9));
user.setCreateDate(rs.getString(10));
list.add(user);
rs每get一个值时顺序应该对应数据表列的序号,其中get里面的序号是代表第几列的数值。
如果这里的顺序错乱就会出现Bad format for 之类的错误,因为定义的javabean里面的数据类型没有与数据库里面的定义的数据类型对应上。
### Error querying database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: SQLステートメントに文法エラーがあります "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL" Syntax error in SQL statement "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL"; SQL statement: SELECT ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL, TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE, TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME FROM DUAL [42000-232] ### The error may exist in file [C:\workspace\evanes-exchange-batch\build\resources\main\sql\CustomZeroFxchangeEventInfoDao.xml] ### The error may involve com.sbibits.evanes.exchange.batch.dao.CustomZeroEventInfoDao.getEventInfo ### The error occurred while executing a query ### SQL: SELECT ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL, TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE, TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME FROM DUAL ### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: SQLステートメントに文法エラーがあります "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL" Syntax error in SQL statement "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL"; SQL statement: SELECT ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL, TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE, TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME FROM DUAL [42000-232] ; bad SQL grammar [] org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: SQLステートメントに文法エラーがあります "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL" Syntax error in SQL statement "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL"; SQL statement: SELECT ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL, TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE, TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME FROM DUAL [42000-232] ### The error may exist in file [C:\workspace\evanes-exchange-batch\build\resources\main\sql\CustomZeroFxchangeEventInfoDao.xml] ### The error may involve com.sbibits.evanes.exchange.batch.dao.CustomZeroEventInfoDao.getEventInfo ### The error occurred while executing a query ### SQL: SELECT ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL, TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE, TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME FROM DUAL ### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: SQLステートメントに文法エラーがあります "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL" Syntax error in SQL statement "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL"; SQL statement: SELECT ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL, TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE, TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME FROM DUAL [42000-232] ; bad SQL grammar [] at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:95) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347) at jdk.proxy3/jdk.proxy3.$Proxy69.selectOne(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87) at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) at jdk.proxy3/jdk.proxy3.$Proxy71.getEventInfo(Unknown Source) at com.sbibits.evanes.exchange.batch.repository.impl.ExchangeOrderRepositoryImpl.getEventInfo(ExchangeOrderRepositoryImpl.java:258) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) at com.sbibits.evanes.exchange.batch.repository.impl.ExchangeOrderRepositoryImpl$$SpringCGLIB$$0.getEventInfo(<generated>) at com.sbibits.evanes.exchange.batch.repository.ExchangeOrderRepositoryTest.testExecuteGetZeroFxchangeFixedRate(ExchangeOrderRepositoryTest.java:62) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.Optional.ifPresent(Optional.java:178) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:411) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: SQLステートメントに文法エラーがあります "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL" Syntax error in SQL statement "SELECT\000a ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL,\000a TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE[*],\000a TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME\000a FROM\000a DUAL"; SQL statement: SELECT ETJP_FXCHANGE_EVENTID_SEQ.NEXTVAL AS NEXTVAL, TO_CHAR(SYSDATE, 'YYYYMMDD') AS EVENTDATE, TO_CHAR(SYSDATE, 'HH24MISS') AS EVENTTIME FROM DUAL [42000-232] at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.message.DbException.getSyntaxError(DbException.java:247) at org.h2.command.Tokenizer.tokenize(Tokenizer.java:541) at org.h2.command.ParserBase.initialize(ParserBase.java:292) at org.h2.command.Parser.parse(Parser.java:552) at org.h2.command.Parser.prepareCommand(Parser.java:484) at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:645) at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:561) at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1164) at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:93) at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:315) at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:328) at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:88) at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:90) at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:60) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) ... 58 more 用H2测试的时候发生上面的问题 在yml里配置了支持oracle debug: false spring: batch: job: enabled: false datasource: hikari: maximum-pool-size: 32 url: jdbc:h2:mem:ZERO;MODE=Oracle; username: password: type: com.zaxxer.hikari.HikariDataSource driver-class-name: org.h2.Driver sql: init: schema-locations: - classpath:db/*.sql 我要怎么修改,解决这个问题
最新发布
10-24
从报错信息 `Error attempting to get column 'properties' from result set. Cause: java.sql.SQLException: Bad format for Timestamp 'k1:v1^k2:v2^randomKey10:randomValue53' in column 16` 可知,该错误是在从结果集中获取 `properties` 列时,将一个非时间戳格式的字符串 `k1:v1^k2:v2^randomKey10:randomValue53` 尝试解析为时间戳导致的。以下是一些可能的解决办法: ### 检查数据库表结构 要保证 `properties` 列的数据类型与实际存储的数据类型相符。若 `properties` 列存储的是键值对字符串,就不应该将其定义为时间戳类型。可以使用如下 SQL 语句查看表结构: ```sql DESCRIBE your_table_name; ``` 若 `properties` 列被错误地定义为时间戳类型,可使用以下 SQL 语句修改列的数据类型: ```sql ALTER TABLE your_table_name MODIFY COLUMN properties VARCHAR(255); ``` ### 检查查询语句 确保查询语句里没有错误地将 `properties` 列当作时间戳处理。例如,不要在查询中使用时间戳相关的函数来处理 `properties` 列。 ### 检查代码逻辑 在代码里,要确保正确处理 `properties` 列的数据。若 `properties` 列存储的是键值对字符串,应该将其作为字符串处理,而非时间戳。以下是一个 Java 示例: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Main { public static void main(String[] args) { try { // 建立数据库连接 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_database", "your_username", "your_password"); Statement statement = connection.createStatement(); // 执行查询 ResultSet resultSet = statement.executeQuery("SELECT properties FROM your_table_name"); while (resultSet.next()) { // 正确获取 properties 列作为字符串 String properties = resultSet.getString("properties"); System.out.println(properties); } // 关闭资源 resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 检查数据来源 要确保插入到 `properties` 列的数据类型是正确的。若插入的数据是键值对字符串,就不要尝试插入时间戳类型的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值