在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:
-
timeBased()
; 为当前时间戳创建一个新的基于时间的 UUID;此方法生成的时间戳适合作为timeuuid
值插入到 Cassandra 中。 -
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);