我有带有日期类型列的cassandra表,如下所示:
create table people ( id int primary key, name text, email text, dob date );
我正在使用SpringBoot 1.5.2 + Spring Data Cassandra Starter。
@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>{ }
我要插入新的Person,如下所示:
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 列类型设置为 时间戳 ,则工作正常。是否可以具有 日期 类型列并使用 java.util.Date 类型属性?
附:即使我使用java.sql.Date,我也会遇到同样的错误。
采用com.datastax.driver.core.LocalDate
com.datastax.driver.core.LocalDate
您可以使用以下任何一种方法LocalDate从java.util.Date
LocalDate
java.util.Date
或者,您可以创建自己的编解码器,以允许您将其插入java.util.DateCassandra日期类型。
您可以像下面这样开始:
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(); } }
创建connectin时,必须注册:
CodecRegistry codecRegistry = new CodecRegistry(); codecRegistry.register(new DateCodec(TypeCodec.date(), Date.class)); Cluster.builder().withCodecRegistry(codecRegistry).build();
有关更多信息:http : //docs.datastax.com/zh-CN/developer/java- driver/3.1/manual/custom_codecs/