使用MongoClient查询MongoDB的_id字段时实体映射异常问题求助
问题原因说明
你第一种查询返回空的核心原因是MongoDB默认存储的_id字段为ObjectId类型,直接传入字符串类型的agentId进行匹配时类型不匹配,自然无法命中数据。
可行解决方案
方案1:使用MongoDB Java驱动原生POJO映射(推荐)
直接通过驱动自带的注解完成字段映射和类型转换,无需额外处理转换逻辑,性能最优:
- 在自定义实体类的主键字段上添加
@BsonId注解,驱动会自动完成Mongo侧_id(ObjectId类型)和实体侧id(String类型)的双向映射:
import org.bson.codecs.pojo.annotations.BsonId; public class MyEntity { @BsonId private String id; // 其他业务字段、getter、setter省略 }
- 直接调用带实体类泛型的查询方法即可直接拿到转换后的实体对象:
MongoDatabase mongoDatabase = mongoClient.getDatabase(mongoDatabaseName); FindIterable<MyEntity> iterable = mongoDatabase.getCollection(tablename, MyEntity.class) .find(eq("_id", new ObjectId(agentId))); MyEntity result = iterable.getFirst();
方案2:使用Jackson注解适配转换
如果项目统一使用Jackson做对象转换,不想引入MongoDB专属注解,可以通过Jackson注解完成字段和类型适配:
- 在实体类主键字段添加对应注解:
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import org.bson.types.ObjectId; public class MyEntity { // 映射Mongo的_id字段 @JsonProperty("_id") // 序列化时自动把ObjectId转为十六进制字符串 @JsonSerialize(using = ToStringSerializer.class) // 反序列化时自动把字符串转为ObjectId @JsonDeserialize(using = ObjectIdDeserializer.class) private String id; // 其他业务字段、getter、setter省略 }
- 拿到查询到的
Document对象后直接用Jackson转换即可,不会再报字段不匹配的错误。
方案3:手动映射字段
如果只是临时查询不想修改实体类,可以手动完成Document到实体的字段映射:
Document doc = mongoDatabase.getCollection(tableName) .find(eq("_id", new ObjectId(agentId))).first(); MyEntity entity = null; if (doc != null) { entity = new MyEntity(); // 手动转换_id为字符串赋值给实体的id字段 entity.setId(doc.getObjectId("_id").toHexString()); // 其他字段可以手动赋值,也可以用工具类批量复制 entity.setXXX(doc.get("xxx", String.class)); }
内容的提问来源于stack exchange,提问作者user1226162
相关产品推荐
相关产品推荐

