Tengo una tabla de Cassandra con una columna de tipo de fecha de la siguiente manera:
create table people ( id int primary key, name text, email text, dob date );Estoy usando 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>{ }Estoy insertando una nueva Persona de la siguiente manera:
personRepository.save(new Person(1, "Siva","siva@gmail.com", new java.util.Date()));Está arrojando el siguiente error:
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]Pero si hago que el tipo de columna dob sea una marca de tiempo, entonces funciona bien. ¿Es posible tener una columna de tipo de fecha y usar las propiedades de tipo java.util.Date ?
Ps: Incluso si uso java.sql.Date, obtengo el mismo error.
Utilice com.datastax.driver.core.LocalDate
Puede usar cualquiera de estos métodos para obtener LocalDate de java.util.Date
O puede crear su propio códec que le permitirá insertar java.util.Date en el tipo de fecha de Cassandra.
Puedes empezar como el siguiente:
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(); } }Al crear la conexión, debe registrarse:
CodecRegistry codecRegistry = new CodecRegistry(); codecRegistry.register(new DateCodec(TypeCodec.date(), Date.class)); Cluster.builder().withCodecRegistry(codecRegistry).build();Para más: http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/