当前位置: 首页 > 知识库问答 >
问题:

如何使用spring数据Cassandra将java.util.date值插入到Cassandra日期类型列中?

常源
2023-03-14

我有一个带有日期类型列的cassandra表,如下所示:

create table people
(
   id int primary key, 
   name text, 
   email text, 
   dob date
);

我正在使用springboot 1.5.2+spring数据卡桑德拉启动程序。

@Table("people")
public class Person {
    @PrimaryKey
    Integer id;
    private String name;
    private String email;
    private java.util.Date dob;
    //setters and getters
}

public interface PersonRepository extends CrudRepository<Person, Integer>{

}

我将按以下方式插入新人:

personRepository.save(new Person(1, "Siva","siva@gmail.com", new java.util.Date()));

它将抛出以下错误:

Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Expected 4 byte long for date (8)
    at com.datastax.driver.core.Responses$Error.asException(Responses.java:136) ~[cassandra-driver-core-3.1.4.jar:na]
    at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:179) ~[cassandra-driver-core-3.1.4.jar:na]
    at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:177) ~[cassandra-driver-core-3.1.4.jar:na]
    at com.datastax.driver.core.RequestHandler.access$2500(RequestHandler.java:46) ~[cassandra-driver-core-3.1.4.jar:na]

但是如果我将dob列类型设置为timestamp,那么它就可以正常工作。是否可以有日期类型列并使用java.util.date类型属性?

附注:即使我使用java.sql.date,我也会得到同样的错误。

共有1个答案

阎宾实
2023-03-14

使用com.datastax.driver.core.localdate

您可以使用任何这些方法从java.util.date获取localdate

  • localdate.fromyearmonthday(2017,03,28)
  • LocalDate.FromMillisIncePoch(new Date().GetTime())

或者您可以创建自己的编解码器,允许您将java.util.date插入到Cassandra日期类型中。

你可以像下面这样开始:

public class DateCodec extends TypeCodec<Date> {

    private final TypeCodec<LocalDate> innerCodec;

    public DateCodec(TypeCodec<LocalDate> codec, Class<Date> javaClass) {
        super(codec.getCqlType(), javaClass);
        innerCodec = codec;
    }

    @Override
    public ByteBuffer serialize(Date value, ProtocolVersion protocolVersion) throws InvalidTypeException {
        return innerCodec.serialize(LocalDate.fromMillisSinceEpoch(value.getTime()), protocolVersion);
    }

    @Override
    public Date deserialize(ByteBuffer bytes, ProtocolVersion protocolVersion) throws InvalidTypeException {
        return new Date(innerCodec.deserialize(bytes, protocolVersion).getMillisSinceEpoch());
    }

    @Override
    public Date parse(String value) throws InvalidTypeException {
        return new Date(innerCodec.parse(value).getMillisSinceEpoch());
    }

    @Override
    public String format(Date value) throws InvalidTypeException {
        return value.toString();
    }

}

创建连接时,必须注册:

CodecRegistry codecRegistry = new CodecRegistry();
codecRegistry.register(new DateCodec(TypeCodec.date(), Date.class));
Cluster.builder().withCodecRegistry(codecRegistry).build();

更多信息:http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/

 类似资料:
  • 重要说明:如果您现在正在处理这个问题,请使用datastax的新cassandra-driver(即导入cassandra ),因为它解决了大多数常见问题,不要再使用旧的cql驱动程序,它已经过时了!这个问题在新驱动开发之前就存在了,我们不得不使用一个不完整的旧库,叫做cql(导入cql 简介我正在使用python库cql访问Cassandra 1.2数据库。在数据库中,我有一个带有时间戳列的表,

  • 命令用于将数据插入到表的列中。 语法: 示例: 在之前的文章中,我们创建一个名为“”的表,其中包含列(, , ),需要在表中插入一些数据。 我们来看看向“”表中插入数据的代码 - 在执行上面语句插入数据后,可以使用SELECT命令验证是否成功插入了数据。 执行结果如下所示 - 如下图所示 -

  • 我正在尝试使用Pig将HDFS中的文件中的数据复制到Cassandra中的表中。但在将数据存储在Cassandra中时,作业失败,出现空指针异常。有人能帮我吗? 用户表结构: 创建表用户(user\u id text主键、age int、第一个文本、最后一个文本) 我的猪脚本 > A=加载“/用户/hduser/用户。txt“使用PigStorage(',')作为(id:chararray,age

  • 主要内容:集合类型,用户定义的数据类型:CQL提供了丰富的内置数据类型,包括集合类型。 除了这些数据类型,用户还可以创建自己的自定义数据类型。 下表提供了CQL中可用的内置数据类型的列表。 数据类型 常量 说明 ascii strings 表示ASCII字符串 bigint bigint 表示64位有符号long类型 blob blobs 表示任意字节 Boolean booleans 表示真或假 counter integers 表示

  • 主要内容:Cassandra自动数据到期Cassandra支持不同类型的数据类型。 下面来看看看下表中的不同数据类型: CQL 常量 描述 asci Strings US-ascii字符串 bigint Integers 64-bit有符号long blob blobs 任意十六进制字节 boolean Booleans True 或 False counter Integers 为64位分布式计数器值 decimal Integers