当前位置: 首页 > 面试题库 >

如何将sql DATE映射到LocalDate

东郭凯捷
2023-03-14
问题内容

我想将a存储LocalDateDATE列中并保持不变。这两个DATELocalDate是“本地”类型的定义。因此, 时区
的概念不应以任何方式干涉。

下面的代码是一个最小示例,该示例DATE在内存数据库中创建带有列的表。Maven工件com.h2database:h2:1.4.192必须在类路径中。

首先,定义方法insertretrieve

static void insert(DataSource ds, String date) throws SQLException {
  try (Connection conn = ds.getConnection();
       Statement stmt = conn.createStatement()) {
    stmt.execute("CREATE TABLE people (id BIGINT NOT NULL AUTO_INCREMENT"
      + ", born DATE NOT NULL, PRIMARY KEY (id) );");
    stmt.execute("INSERT INTO people (born) VALUES ('" + date + "')");
  }
}

static LocalDate retrieve(DataSource ds) throws SQLException {
  try (Connection conn = ds.getConnection();
       Statement stmt = conn.createStatement();
       ResultSet rs = stmt.executeQuery("SELECT * FROM people limit 1")) {
    if (rs.next()) {
      java.sql.Date retrieved = java.sql.Date.valueOf(rs.getString("born"));
      return retrieved.toLocalDate();
    }
    throw new IllegalStateException("No data");
  }
}

请注意,该insert方法使用单引号引起来的toStringLocalDate,因此Java™没有机会创建时区歧义。现在,insert一次调用几次retrieve,每次使用不同的时区设置:

public static void main(String[] args) throws Exception {
  DataSource ds = JdbcConnectionPool.create("jdbc:h2:mem:test", "sa", "sa");
  LocalDate born = LocalDate.parse("2015-05-20");
  insert(ds, born.toString());
  System.out.println("Inserted:  " + born);
  for (int i : new int[]{-14, 0, 12}) {
    TimeZone z = TimeZone.getTimeZone(String.format("Etc/GMT%+02d", i));
    TimeZone.setDefault(z);
    System.out.println("Retrieved: " + retrieve(ds));
  }
}

然后打印以下内容:

插入的:2015-05-20
检索:2015-05-20
检索:2015-05-19
检索:2015-05-18

假设数据库表未更改,如何编写该retrieve方法以使其返回 无条件 插入的相同值?


问题答案:

我只是尝试对您的retrieve方法进行以下修改,但对我有用:

DATE类型的H2文档说它是

日期数据类型。格式为yyyy-MM-dd。

所以,而不是你的…

java.sql.Date retrieved = (java.sql.Date) rs.getObject("born");
return retrieved.toLocalDate();

我刚用过

return LocalDate.parse(rs.getString("born"));

…和我的代码产生

Inserted:  2015-05-20
Retrieved: 2015-05-20
Retrieved: 2015-05-20
Retrieved: 2015-05-20


 类似资料:
  • 问题内容: 我在了解如何实现这一目标方面遇到了问题。 基本上我们有一个API,用户发送以下格式的JSON :(如果代码不完美,请原谅,但您可以理解) 好的,我不确定我是否正确设置了JSON格式,但是现在这是我的问题。 我有一个带有参数Name,Last的类,还有一个作为其成员之一的对象Client和Property Date。 像这样: 因此,基本上,我不确定如何获取JSON,然后将其映射到我的对

  • 本文向大家介绍Django如何将URL映射到视图,包括了Django如何将URL映射到视图的使用技巧和注意事项,需要的朋友参考一下 前言 URLconf 就像是 Django 所支撑网站的目录。它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。但必须记住的是视图函数必须位于

  • 我有一个带有域类的Grails项目。这个持久类应该映射到JavaDTO。我在这里发现了一个非常旧的Grails插件,它并没有真正解决这个问题。 是否有一个插件或方法: 注释映射到相应DTO类的域类属性

  • 我有这些网址 如何设置web.xml以将此模式映射到servlet? 其中xx是一个两个字母的字符串。我把什么放在xx的地方,这样上面的所有链接都将转到MyClass?

  • 在我的服务中,我试图将实体映射到,但是由于方法返回(),我不能像通常用于那样进行如下转换。它为方法抛出“不能在'iterable'中解析方法'stream'”错误。 那么,如何将这个实体映射到?

  • 问题内容: 我们有一张有很多列的大桌子。移至MySQL Cluster后,由于以下原因无法创建表: 错误1118(42000):行大小太大。不包括BLOB在内的已使用表类型的最大行大小为14000。这包括存储开销,请查阅手册。您必须将某些列更改为TEXT或BLOB 举个例子: 这是用于存储配置参数的表。我在想,我们可以将一些列合并为一个列,并将其存储为JSON对象,然后将其转换为Java对象。 例