在cassandra中,我的一个列类型是timeuuid,其java类型等效于documentation是java.util.UUID
我的输入时间为java.sql.Timestamp,为了在实体类中设置它,我想转换 java.sql.Timestamp - > java.util.UUID中
答案 0 :(得分:3)
首先,您提到的文档涉及DataStax Java驱动程序的旧版本,您应该升级到version 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()
不兼容。
答案 1 :(得分:0)
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);
答案 2 :(得分:0)
引用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,但它不会匹配任何{{1}在数据库中。
答案 3 :(得分:0)
您可以使用java.sql.Timestamp作为种子生成java.util.UUID。
但是,每次生成新的UUID都不是转换,它会有所不同。