Сопоставьте java.time.Duration от JDK8 + до столбца Cassandra DB с типом time.
Я не смог найти ни стандартного сопоставления, ни какого-либо кодека (даже в зависимости от maven с дополнительными кодеками), который мог бы это сделать. Это проект maven java 8 с драйвером datastax для Cassandra DB.
Кто-нибудь знает жизнеспособное решение для этого или любого кодека? Если нет, то это лучший способ решить проблему через java.sql.time или это вообще возможно?
Если я забыл некоторые важные детали, прокомментируйте, пожалуйста, ниже.




Используйте Cassandra типа duration, а не time.
Передайте или проанализируйте стандартные строки ISO 8601 с помощью класса 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 не времяКласс java.time.Duration представляет промежуток времени, не привязанный к временной шкале. нет представляет время суток.
Тип Cassandra time определяется как:
Value is encoded as a 64-bit signed integer representing the number of nanoseconds since midnight. Values can be represented as strings, such as 13:30:54.234.
Таким образом, вам не следует сохранять значение Duration, используя тип Cassandra time.
У вас есть другие варианты.
Один из вариантов - сохранить стандартный Текстовое представление продолжительности ISO 8601: PnYnMnDTnHnMnS. Пример: полтора часа - это PT1H30M. Этот вариант более правдивый, но значения нельзя сравнивать или отсортировать в 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.
DurationCassandra документация говорит типа duration встроен. Я не использую Cassandra, поэтому не могу за нее поручиться.
В документе указано, что он принимает в качестве входных данных стандартную строку продолжительности ISO 8601. Метод Duration::toString в Java генерирует такие строки, а Duration::parse анализирует их.
String inputDurationForCassandra = duration.toString() ;
И парсинг.
Duration duration = Duration.parse( myCassandraDurationString ) ;
Имейте в виду, что Java использует класс Duration для дней (общие 24-часовые фрагменты, а не календарные дни), часов, минут и секунд. Класс Period представляет годы, месяцы, дни. Обычно нет смысла объединять эти две концепции. Но если вы настаиваете, вы можете использовать класс PeriodDuration из библиотеки проекта ThreeTen-Extra.
Абсолютно верно, я только что осознал разницу ... В документации apache cassandra указано, что уже должен быть тип продолжительности: cassandra.apache.org/doc/latest/cql/types.html Но я не мог создать поле с этим типом, и я не мог найти никакой информации о версии Apache Cassandra на эта страница, на которой основана статья, чтобы я мог проверить, не устарела ли моя версия.
Предложите переформулировать свой вопрос, чтобы он не относился к запросу библиотеки / инструмента. Просто спросите: как мне сопоставить
java.time.Durationсо столбцом Cassandra DB с типомtime? Подробнее в центр помощи. См. Также Как мне задать хороший вопрос?, Каких типов вопросов мне следует избегать? и Какие темы я могу задать здесь?(Не мой голос против).