Fetching/selecting 底部 N 个元素弄乱了结果集中时间戳的值(我认为是因为时区)

Fetching/selecting bottom N elements is messing up the value of time stamp in result set (because of time zone I think)

我花了将近一天的时间试图以 多种方式 从具有几十万行的 table 中获取底部 10 行。但是结果集中的时间戳总是乱七八糟(这是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 种方法 select 从数据库中获取底部 10 行。如果我 select 在一个范围内,我也总是得到空列表。

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].

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