无法从具有时间戳字段的 datastax 中检索数据

Posted

技术标签:

【中文标题】无法从具有时间戳字段的 datastax 中检索数据【英文标题】:Unable to retrieve the data from datastax having timestamp field 【发布时间】:2019-11-19 23:19:28 【问题描述】:

我在键空间myks中有下表

CREATE table IF NOT EXISTS myks.users (
    user_name text,
    email text,
    created_at timestamp,
    updated_at timestamp,
    PRIMARY KEY (user_name)
);

下面是模型类

@Table(value = "users")
public @Data class Users
    @PrimaryKey
    @Column("user_name")
    @CassandraType(type = DataType.Name.TEXT)
    private String user_name;

    @Column("email")
    @CassandraType(type = DataType.Name.TEXT)
    private String email;

    @Column("created_at")
    @CassandraType(type = DataType.Name.TIMESTAMP)
    private Timestamp created_at;

    @Column("updated_at")
    @CassandraType(type = DataType.Name.TIMESTAMP)
    private Timestamp updated_at;

存储库接口

@Repository
public interface UsersRepository extends CrudRepository<Users, String> 

将以下值插入到表中

Users users = new Users();
LocalDateTime ldt_created = LocalDateTime.now();
LocalDateTime ldt_updated = ldt_created.plus(1000, ChronoUnit.MILLIS);
Timestamp ts_created = Timestamp.valueOf(ldt_created);
Timestamp ts_updated = Timestamp.valueOf(ldt_updated);
users.setUser_name(krishna");
users.setEmail("krishna@gmail.com");
users.setCreated_at(ts_created);
users.setUpdated_at(ts_updated);
usersRepository.save(users);

它已保存在表中,但在检索数据时抛出以下异常

No converter found capable of converting from type [java.util.Date] to type [java.sql.Timestamp]

【问题讨论】:

【参考方案1】:

CQL 的timestamp 类型映射到java.util.Date Java 类型,所以你需要使用它来代替Timestamp。有关此类型和其他类型,请参阅 CQL to Java mapping table。

您还可以使用所谓的可选编解码器(附加依赖项)将timestamp 映射到其他Java 类型,例如Instant。请参阅documentation 了解更多信息。

【讨论】:

【参考方案2】:

java.util.Date 在驱动程序 4.X java-driver-mapper-processor 版本中不再使用。而是使用Java.time.Instantjava.util.Date 中的映射不再起作用,并引发异常: Field: expiration_date, Entity Type: java.util.Date, CQL type: TIMESTAMP

所以实际的解决方案是使用Java.time.Instant 用于4.X,java.util.Date 用于3.X。

【讨论】:

以上是关于无法从具有时间戳字段的 datastax 中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 datastax java 驱动程序通过 UDT 键从 cassandra 检索

从纪元时间戳列中仅检索具有今天日期的记录

检索“主”对象列表时,Backand 无法检索“从”对象

无法返回 null 或不可为 null 的字段 User.Role 无法从 prisma 突变中检索相关数据

在 postgres 中,如何从事件日志类型表(具有时间戳)中获取特定时间范围内字段的总和(或汇总)

iOS:如何从 Firebase 检索创建于/更新的时间戳?