java - 获取/选择底部 N 个元素会弄乱结果集中时间戳的值(我认为是因为时区)

标签 java datetime jpa spring-data-jpa timezone-offset

我花了将近一天的时间尝试通过多种方式从一个拥有数十万行的表中获取最后 10 行。但是结果集中的时间戳总是困惑7个小时(这是UTC和我本地之间的时差)

架构

CREATE TABLE IF NOT EXISTS xyz(
  id timestamp NOT NULL, 
  name varchar(40) NOT NULL, 
  PRIMARY KEY (id,name )
);

运行 select * from xyz order by id desc limit 10 后数据库中的底部 10 个条目;

 2020-05-12 12:00:00+00  
 2020-05-12 12:00:00+00  
 2020-05-12 11:59:00+00  
 2020-05-12 11:58:00+00  
 2020-05-12 11:58:00+00  
 2020-05-12 11:58:00+00  
 2020-05-12 11:57:00+00  
 2020-05-12 11:56:00+00  
 2020-05-12 11:56:00+00  
 2020-05-12 11:55:00+00

我尝试了以下 3 种从数据库中选择底部 10 行的方法。另外,如果我在一个范围内选择,我总是会得到空列表。

List<xyz> findTop10ByOrderByIdDesc();
List<xyz> findTop10DistinctByIdBetweenOrderByIdDesc(LocalDateTime now,LocalDateTime after);
List<xyz> findTop10DistinctByIdBetweenOrderByIdDesc(Date now,Date after);

这里是 POJO,用于保存上述查询的结果集

public class xyz{
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private java.util.Date id;
//private LocalDateTime id
  private String name;

// ...
}

但是 id 字段总是关闭 7 小时(例如:我得到的第一个元素是 2020-05-12 05:00:00)。 a) 如何修复我的代码以获得 POJO(或结果集)中的正确时间戳。 b)如何检索某个范围内的所有条目(我现在得到空列表)。我认为两者是相关的

最佳答案

java.util.Date 从技术上讲,根据文档代表一个时间点。 但实际上,它是一种可怕的混合物,可用于各种用途。 这会导致数据库、驱动程序以及其上的任何 ORM 层中发生各种奇怪的(可能是完全错误的)事情。

幸运的是,java.util.Date 现在在 java.time.* package 中有一个适当的替换。 。 您似乎对某个时间点感兴趣:事件何时发生。 正确的数据类型是[Instant][1]

虽然我不能保证任何事情,但以正确的方式持久化和加载的机会要大得多。

关于java - 获取/选择底部 N 个元素会弄乱结果集中时间戳的值(我认为是因为时区),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61810380/

相关文章:

python - 从用户处获取 2 个不同的日期输入

java - 通过嵌套列表对象中的多个值查找对象 Hibernate、Jpa

java - Spring Boot 2 中 Micrometer 的自定义 Cloudwatch MeterRegistry

从 S3 存储桶访问时出现 java.io.FileNotFoundException?

java - 使用 apache poi 超链接到同一工作簿中的不同工作表

c# - 优化 DateTime.Now 的替代方案

c - 如何从给定参数获取一周的第一天并打印从周一到周日的整周?

java - 插入初始数据 JPA

jsf - 需要 EJB 3.1 Singleton + JPA + JSF 设计建议

java - Codility - 功能改变