【问题标题】:Cannot create a query on an entity that has LocalDateTime field on MongoDB无法在 MongoDB 上具有 LocalDateTime 字段的实体上创建查询
【发布时间】:2016-11-26 05:10:58
【问题描述】:
我可以将具有 LocalDateTime 字段的实体保存到数据存储区。然而,
我正在尝试查询具有 LocalDateTime 字段的实体。当我创建查询并调用 asList 方法时,会抛出以下异常:
java.lang.RuntimeException: org.mongodb.morphia.mapping.MappingException: No usable constructor for java.time.LocalDateTime
【问题讨论】:
标签:
mongodb
morphia
localdate
nosql
【解决方案1】:
Morphia 在将实体从 MongoDB 映射到 Java 对象时依赖默认构造函数,因为 java.time.LocalDateTime 类没有它会引发异常。
你可以使用@PreLoad生命周期注解来转换数据,如下:
@Entity
public class MyEntity {
public MyEntity() {
}
@Id
private ObjectId id;
private LocalDateTime localDateTime;
@PreLoad
public void preLoad(DBObject obj) {
BasicDBObject object = (BasicDBObject) obj.get("localDateTime");
BasicDBObject date = (BasicDBObject) object.get("date");
BasicDBObject time = (BasicDBObject) object.get("time");
localDateTime = LocalDateTime.of(date.getInt("year"),
date.getInt("month"),
date.getInt("day"),
time.getInt("hour"),
time.getInt("minute"),
time.getInt("second"),
time.getInt("nano"));
obj.removeField("localDateTime");
}
}
【解决方案2】:
Morphia 目前不支持 Java 8 日期/时间类型。目前有一个新模块正在代码审查中,希望在 1.3 版本中添加此支持。