H2 数据库 - Java 的 OffsetDateTime 和 h2 类型之间的映射
H2 Database - mapping between Java's OffsetDateTime and h2 type
我正在使用 H2 Database 进行单元测试。
根据 H2 官方文档,Java 的 OffsetDateTime
和 h2 数据类型之间没有映射(TIMESTAMP WITH TIME ZONE
映射到 java 的 H2 TimestampWithTimezone
类型,这不是我需要的)。
有什么办法可以实现吗?
虽然一个普通的 getObject(int columnIndex)
确实会 return 一个 org.h2.api.TimestampWithTimeZone
对象,但是使用 getObject(int columnIndex, Class<T> type)
到 return 一个 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 Database 进行单元测试。
根据 H2 官方文档,Java 的 OffsetDateTime
和 h2 数据类型之间没有映射(TIMESTAMP WITH TIME ZONE
映射到 java 的 H2 TimestampWithTimezone
类型,这不是我需要的)。
有什么办法可以实现吗?
虽然一个普通的 getObject(int columnIndex)
确实会 return 一个 org.h2.api.TimestampWithTimeZone
对象,但是使用 getObject(int columnIndex, Class<T> type)
到 return 一个 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);
}
}
}