簡體   English   中英

如何將java.time.Duration映射到類型為time的Cassandra DB列

[英]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進行解決的最佳方法,還是有可能?

如果我忘記了一些主要細節,請在下面評論。

TL;博士

使用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內部使用的兩個數字:

  • 64位整數,以秒為單位。
  • 一個32位整數,以分數秒為單位的納秒計數。

如果您堅持認為,可以使用這些數字生成一個值來存儲為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM