[英]How do I map a java.time.Duration to a Cassandra DB column with type time
將類型為time的java.time.Duration從JDK8 +映射到Cassandra DB列。
我找不到能夠做到這一點的任何標准映射或任何編解碼器(甚至在具有額外編解碼器的maven依賴項中)。 這是一個Java 8 maven項目,帶有用於Cassandra DB的datastax驅動程序。
有人知道這個或任何編解碼器的可行解決方案嗎? 如果不是,這是通過java.sql.time進行解決的最佳方法,還是有可能?
如果我忘記了一些主要細節,請在下面評論。
使用Cassandra類型的duration
而不是time
。
使用java.time.Duration
類傳遞或解析標准ISO 8601字符串。
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
類表示未附加到時間軸的時間跨度。 它並不代表時間的一天。
卡桑德拉time
類型定義為:
值被編碼為一個64位帶符號整數,表示自午夜以來的納秒數。 值可以表示為字符串,例如13:30:54.234。
因此,您不應使用Cassandra time
類型存儲Duration
值。
您還有其他選擇。
一種選擇是存儲持續時間的標准ISO 8601文本表示形式 : 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 文檔說 duration
類型是內置的。 我不是Cassandra的用戶,所以我不能擔保。
該文檔指出,它接受標准的ISO 8601持續時間字符串作為輸入。 Java中的Duration::toString
方法生成這樣的字符串,而Duration::parse
解析相同的字符串。
String inputDurationForCassandra = duration.toString() ;
並解析。
Duration duration = Duration.parse( myCassandraDurationString ) ;
請注意,Java將Duration
類用於幾天(通用的24小時塊,而不是日歷天),小時,分鍾和秒。 Period
類代表年,月,日。 將兩個概念結合在一起通常是沒有意義的。 但是,如果您堅持要使用,可以使用ThreeTen-Extra項目庫中的PeriodDuration
類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.