如何将java.sql.Timestamp转换为java.util.UUID



在Cassandra中,我的列类型之一是timeuuid,根据文档,其Java类型等效于java.util.UUID

我的输入时间是java.sql.Timestamp,为了在实体类中设置它,我想将java.sql.Timestamp -> java.util.UUID转换为java.util.UUID。

首先,您提到的文档引用了非常旧版本的DataStax Java驱动程序,您应该升级到3.0.0版本。

也就是说,DataStax Java驱动程序带有一个实用程序类,com.datastax.driver.core.utils.UUIDs 。它有三种有用的方法来处理基于时间的 UUID:

  1. timeBased() ; 为当前时间戳创建一个新的基于时间的 UUID;此方法生成的时间戳适合作为timeuuid值插入到 Cassandra 中。
  2. startOf(long)endOf(long):这些方法分别提供给定时间戳的最低和最高可能 UUID。它们主要适用于查询一系列timeuuid值。

但是,在您的情况下,您似乎正在从具有固定时间戳的 RDBMS 迁移数据。我建议您始终使用startOf(long)来迁移数据:

java.sql.Timestamp tp = ...;
UUID uuid = UUIDs.startOf(tp.getTime());

在任何情况下,都不要尝试手动创建此类 UUID,因为 Cassandra 对timeuuid值进行排序的方式与 UUID.comapreTo() 不兼容。

引用 https://docs.datastax.com/en/cql/3.0/cql/cql_reference/valid_literal_r.html

Timeuuid

使用自 00:00

:00.00 UTC(60 位)以来的 100 纳秒间隔时间、防止重复的时钟序列号(14 位)加上 IEEE 801 MAC 地址(48 位)生成唯一标识符。例如:d2177dd0-eaa2-11de-a572-001b779c76e3

因此,timeuuid不仅仅包含时间戳,这意味着您可能会从java.sql.Timestamp生成一些 UUID,但它不会匹配数据库中的任何timeuuid

您可以使用

java.sql.Timestamp作为种子生成java.util.UUID。

但是,这不是转换,因为每次生成新的UUID时,它都会有所不同。

java.sql.Timestamp  tp =new java.sql.Timestamp(Calendar.getInstance().getTimeInMillis());
System.out.println(tp);
java.util.UUID uid= new java.util.UUID(tp.getTime(),0);
System.out.println(uid);

相关内容

最新更新