如何将java.time.Duration映射到具有时间类型的Cassandra DB列

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (31)

目标:

将java.time.Duration从JDK 8+映射到具有时间类型的CassandraDB列。

情况:

我找不到任何标准映射或任何编解码器(即使是在带有额外编解码器的maven依赖项中)。这是一个java8maven项目,带有CassandraDB的DataStax驱动程序。

问题:

有没有人知道这个或任何编解码器的可行解决方案?如果不是,这是通过java.sql.time解决问题的最佳方法,还是甚至有可能?

提问于
用户回答回答于

TL;DR

使用Cassandra类型duration而不是time

使用java.time.Duration上课。

Duration.parse( "PT1H30M" )  // Parse ISO 8601 string into a `Duration` object.
        .toString()          // Generate a ISO 8601 string from the `Duration` object.

Duration不是时候

类表示独立于时间线的时间跨度。是的代表一天中的一段时间。

time类型被定义为:

值被编码为64位有符号整数,表示自午夜以来的纳秒数。值可以表示为字符串,如13:30:54.234。

因此,不应该存储Duration值使用Cassandratime类型。

PnYnMnDTnHnMnS。一个小时半是PT1H30M。这个选项更真实,但是值不能在Cassandra中进行比较或排序,因为它们只是文本,而不按字母顺序按时间顺序排列。此外,请参阅本答复中下文的“Cassandra工期”一节。

另一种选择是提取内部使用的两个数字。Duration:

  • 64位整数,整秒数。
  • 32位整数,以小数秒计的纳秒数.

如果坚持,可以使用这些数字生成一个值存储为卡桑德拉time但你会违反语义学的。

long fakeNanosSinceMidnight = TimeUnit.SECONDS.toNanos( duration.getSeconds ) + duration.getNano() ;  // NOT recommended, but if you insist on abusing Cassandra semantics, here you go. 

duration类型是内置的。

文档声明它接受一个标准的ISO 8601持续时间字符串作为输入。Duration::toString方法在Java中生成这样的字符串Duration::parse分析也一样。

String inputDurationForCassandra = duration.toString() ;

和解析。

Duration duration = Duration.parse( myCassandraDurationString ) ;

扫码关注云+社区

领取腾讯云代金券