2017-03-28 1 views
4

J'ai table avec cassandra une colonne de type date comme suit:Comment insérer les valeurs java.util.Date dans la colonne Type de date Cassandra à l'aide de Spring Data Cassandra?

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

J'utilise SpringBoot 1.5.2 + printemps données 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>{ 

} 

Je l'insertion d'une nouvelle personne comme suit:

personRepository.save(new Person(1, "Siva","[email protected]", new java.util.Date())); 

Il jette l'erreur suivante:

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] 

Mais si je fais DOB type de colonne à horodatage puis ça fonctionne bien. Est-il possible d'avoir la colonne de type date et d'utiliser les propriétés de type java.util.Date? P.: Même si j'utilise java.sql.Date, j'obtiens la même erreur.

+0

Avez-vous essayé d'ajouter une annotation '@Temporal (TemporalType.TIMESTAMP) '? – Andremoniy

+0

Je n'utilise pas JPA. Existe-t-il une telle annotation pour Cassandra? –

+0

Vraiment? Que sont les annotations 'Table' et' PrimaryKey'? – Andremoniy

Répondre

8

Utilisez com.datastax.driver.core.LocalDate

Vous pouvez utiliser l'une de ces méthodes pour obtenir LocalDate de java.util.Date

  • LocalDate.fromYearMonthDay (2017, 03, 28)
  • LocalDate.fromMillisSinceEpoch (new Date () .getTime())

Ou vous pouvez créer yo votre propre codec qui vous permettra d'insérer java.util.Date dans le type de date Cassandra.

Vous pouvez commencer comme ci-dessous un:

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(); 
    } 

} 

Lors de la création connectin vous devez vous inscrire:

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

Pour en savoir plus: http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/