目标:
将JDK8+中的java.time.Duration列映射到类型为time的Cassandra DB列。
情况:
我找不到任何能够做到这一点的标准映射或任何编解码器(即使在具有额外编解码器的maven依赖中)。这是一个带有Cassandra DB的datastax驱动程序的java 8 maven项目。
问题:
有没有人知道这个或任何编解码器的可行解决方案?如果不是,这是通过java.sql.time解决问题的最好方法吗?或者甚至是可能的?
在这种情况下,我忘记了一些主要的细节,请在下面评论。
发布于 2018-06-04 23:29:50
tl;dr
使用Cassandra类型的duration
而不是time
。
使用java.time.Duration
类传递或解析标准ISO8601字符串。
Duration.parse( "PT1H30M" ) // Parse ISO 8601 string into a `Duration` object.
.toString() // Generate a ISO 8601 string from the `Duration` object.
Duration
不是一个时间
java.time.Duration
类表示未附加到时间线的时间跨度。它不表示一天中的某个时间。
Cassandra time
类型定义为:
值被编码为64位有符号整数,表示自午夜以来的纳秒数。值可以表示为字符串,例如13:30:54.234。
因此,您不应该使用Cassandra time
类型存储Duration
值。
你还有其他选择。
一种选择是存储标准的ISO 8601 textual representation of a duration:PnYnMnDTnHnMnS
。例如:一个半小时是PT1H30M
。这个选项更真实,但是不能在Cassandra中对值进行比较或排序,因为它们只是文本,没有按时间顺序的字母顺序。另外,请参阅下面的“Cassandra持续时间”部分。
另一种选择是提取Duration
内部使用的两个数字
如果您坚持使用这些数字,您可以使用这些数字生成一个值,并将其存储为Cassandra time
,但这样做违反了语义。
long fakeNanosSinceMidnight = TimeUnit.SECONDS.toNanos( duration.getSeconds ) + duration.getNano() ; // NOT recommended, but if you insist on abusing Cassandra semantics, here you go.
卡桑德拉Duration
Cassandra documentation says是内置的duration
类型。我不是Cassandra的用户,所以我不能保证它。
文档声明它接受标准的ISO 8601持续时间字符串作为输入。Java中的Duration::toString
方法生成这样的字符串,而Duration::parse
则解析它们。
String inputDurationForCassandra = duration.toString() ;
和解析。
Duration duration = Duration.parse( myCassandraDurationString ) ;
请注意,Java使用Duration
类表示天(通用的24小时块,而不是日历日)、小时、分钟和秒。Period
类表示年、月、日。将这两个概念结合起来通常是没有意义的。但是如果您坚持,您可以使用项目库中的PeriodDuration
类。
https://stackoverflow.com/questions/50683434
复制相似问题