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

时间:2016-03-18 07:24:52

标签: java cassandra

在cassandra中,我的一个列类型是timeuuid,其java类型等效于documentation是java.util.UUID

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

4 个答案:

答案 0 :(得分:3)

首先,您提到的文档涉及DataStax Java驱动程序的旧版本,您应该升级到version 3.0.0

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

  1. timeBased();为当前时间戳创建新的基于时间的UUID;此方法生成的时间戳适合以timeuuid值插入Cassandra。
  2. startOf(long)endOf(long):这些方法分别为给定时间戳提供最低和最高可能的UUID。它们主要适用于查询一系列timeuuid值。
  3. 但是,在您的情况下,您似乎正在从具有固定时间戳的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都不是转换,它会有所不同。