Реализация MyBatis LocalDateTimeTypeHandler зависит от преобразования поставщика
Моя среда:
- Java 8
- MyBatis 3.5.6
- SAP jConnect для JDBC 16.0 SP04 (примечание: 16.0 SP04 теперь совместим с JDBC4.2 )
У меня проблема с
LocalDateTimeHandler
с SAP jConnect. Выполнение инструкции SELECT для столбца с сопоставлением со свойством вызывает SQLException (вызванное ClassCastException).
Caused by: java.lang.ClassCastException: Cannot cast com.sybase.jdbc42.tds.SybTimestamp to java.time.LocalDateTime
at java.lang.Class.cast(Class.java:3369)
at com.sybase.jdbc42.jdbc.SybResultSet.convertObjectToJavaType(SybResultSet.java:3665)
at com.sybase.jdbc42.jdbc.SybResultSet.getObject(SybResultSet.java:3632)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.logging.jdbc.ResultSetLogger.invoke(ResultSetLogger.java:69)
at com.sun.proxy.$Proxy211.getObject(Unknown Source)
at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:38)
at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:28)
at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:85)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getPropertyMappingValue(DefaultResultSetHandler.java:511)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyPropertyMappings(DefaultResultSetHandler.java:480)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:404)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:354)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:328)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:301)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:194)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
at org.apache.ibatis.executor.ReuseExecutor.doQuery(ReuseExecutor.java:60)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427)
... 54 more
MyBatis LocalDateTimeTypeHandler ожидает, что вернет объект, но jConnect его не поддерживает. Согласно спецификации javadoc и JDBC 4.2 для
TIMESTAMP
столбец, только
java.sql.Timestamp
преобразование типов должно поддерживаться как минимум, но другие преобразования типов (включая
LocalDateTime
) не будут поддерживаться некоторыми поставщиками.
Мои вопросы:
- Это ошибка MyBatis? или по замыслу, чтобы поддерживать только некоторых конкретных поставщиков?
- Есть ли обходной путь?
Справка
- javadoc: ResultSet.getObject()https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getObject-java.lang.String-java.lang.Class-
- Спецификация API JDBC 4.2: https://download.oracle.com/otndocs/jcp/jdbc-4_2-mrel2-spec/index.html
- ТАБЛИЦА B-3 Сопоставление типов JDBC с типами объектов Java