H2 数据库 - Java 的 OffsetDateTime 和 h2 类型之间的映射

Posted

技术标签:

【中文标题】H2 数据库 - Java 的 OffsetDateTime 和 h2 类型之间的映射【英文标题】:H2 Database - mapping between Java's OffsetDateTime and h2 type 【发布时间】:2017-08-10 13:07:34 【问题描述】:

我正在使用H2 Database 进行单元测试。

根据H2官方文档,Java的OffsetDateTime和h2数据类型之间没有映射关系(TIMESTAMP WITH TIME ZONE映射到java的H2TimestampWithTimezone类型,这不是我需要的)。

有什么办法可以做到吗?

【问题讨论】:

【参考方案1】:

虽然一个普通的getObject(int columnIndex) 确实会返回一个org.h2.api.TimestampWithTimeZone 对象,但使用getObject(int columnIndex, Class<T> type) 来返回一个java.time.OffsetDateTime 似乎对使用H2 版本1.4.196 的我来说可以正常工作:

package h2test;

import java.sql.*;
import java.time.OffsetDateTime;

public class H2testMain 

    public static void main(String[] args) 
        try (Connection conn = DriverManager.getConnection("jdbc:h2:mem:test")) 
            Statement st = conn.createStatement();
            st.execute("CREATE TABLE TEST (ID INT PRIMARY KEY, TWTZ TIMESTAMP WITH TIME ZONE)");
            st.execute("INSERT INTO TEST (ID, TWTZ) VALUES (1, '1981-02-03 19:20:21-02:00')");
            ResultSet rs = st.executeQuery("SELECT TWTZ FROM TEST WHERE ID=1");
            rs.next();
            OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class);
            System.out.println(odt.getClass().getName());  // java.time.OffsetDateTime
            System.out.println(odt.toString());  // 1981-02-03T19:20:21-02:00
         catch (Exception e) 
            e.printStackTrace(System.err);
        
    


【讨论】:

以上是关于H2 数据库 - Java 的 OffsetDateTime 和 h2 类型之间的映射的主要内容,如果未能解决你的问题,请参考以下文章

org.h2.jdbc.JdbcSQLSyntaxErrorException h2 数据库 java

java中如何停止h2数据库服务器并启动h2数据库服务器编程

H2数据库用户定义的java函数类未找到

关系数据库数组(H2、Java)

H2 数据库 Java Servlet 连接路径问题

java需要h2数据库抛出jdbc异常