【问题标题】:New cassandra bound statement getDate method新的 cassandra 绑定语句 getDate 方法
【发布时间】:2018-06-21 14:22:34
【问题描述】:

在一个有点遗留的项目中,我们在 Spring 应用程序中使用了版本 2 的 cassandra 驱动程序。 这个版本,特别是BoundStatement 类公开了一个方法getDate,它返回一个java Date。我们都知道旧的 java 日期 api 非常糟糕,但是小心使用时它确实可以完成工作。

现在,出于某种需要,我们决定将 cassandra 驱动程序升级到 3.4 版。首先要注意的是,在这个版本中,相同的方法getDate 现在返回一个类型为LocalDate 的日期,datastax 团队实现了一个类来替代java 的类。文档中提到了这个类的有趣之处:

在 ISO 8601 中没有时间组件、没有时区的日期 日历。请注意,ISO 8601 与 Java中使用的默认公历:它使用预测公历 日历,意味着它无限期地回到过去 (没有公历变化);有一年 0. 这个班 实现这些差异,以便年/月/日字段匹配 正是 CQL 字符串文字中的那些。

所以基本上,这个类会截断time 信息。此更改导致基于日期比较的单元测试中的一些失败,并且需要进行一些测试修改。对我来说,这实际上似乎很奇怪,但我想 datastax 团队做出这样的选择一定有充分的理由。我很高兴听到对此了解更多的人的意见。

【问题讨论】:

    标签: java spring date cassandra


    【解决方案1】:

    驱动程序 2 中的getDate 在驱动程序 3.0 中移至 getTimestamp,如 upgrade guide 中所述:

    1. Getter 和 setter 已添加到新 CQL 类型的“数据容器”类中:

      • TINYINT 类型的 getByte/setByte
      • getShort/setShort 用于 SMALLINT 类型
      • 时间类型的getTime/setTime
      • 日期类型的getDate/setDate

    TIMESTAMP CQL 类型的方法已重命名为 getTimestamp 和 setTimestamp。

    这会影响 Row、BoundStatement、TupleValue 和 UDTValue。

    这样做的主要理由是在 Cassandra 3.0 中添加了 date 类型。为防止将来出现混淆,我们将现有的 getDate 移至 getTimestamp,以便 get 方法与它们的 cql 类型名称匹配。

    【讨论】:

    • 感谢您的澄清。同一个吸气剂一直在工作,这有点令人困惑,就像它在说别担心一切都在正常工作,而我没有找到指南的这一特定部分。
    猜你喜欢
    • 2015-12-06
    • 2014-09-27
    • 2016-07-25
    • 2016-09-24
    • 2017-03-24
    • 2017-11-08
    • 1970-01-01
    • 2012-06-22
    • 2019-03-16
    相关资源
    最近更新 更多