Java 使用MongoTemplate时如何将类型从ObjectId转换为Long?
通常在使用spring数据存储库时,需要一个可以存储结果数据的对象,如本例中的客户: 在我的例子中,我试图使用一个对象,它是在我使用maven导入的另一个项目中声明的——让我们称它为Java 使用MongoTemplate时如何将类型从ObjectId转换为Long?,java,spring,spring-boot,spring-data,spring-data-mongodb,Java,Spring,Spring Boot,Spring Data,Spring Data Mongodb,通常在使用spring数据存储库时,需要一个可以存储结果数据的对象,如本例中的客户: 在我的例子中,我试图使用一个对象,它是在我使用maven导入的另一个项目中声明的——让我们称它为MyDoc。对象有一个属性Long id,而MongoDB中的文档有一个添加字段\u id,来自typeObjectId。顺便说一句,之所以如此,是因为MongoDB用作存档,MyDoc中的实际id不会是唯一的 在服务类中,我使用MongoTemplate进行如下数据库查询: List<MyDoc> li
MyDoc
。对象有一个属性Long id
,而MongoDB中的文档有一个添加字段\u id
,来自typeObjectId
。顺便说一句,之所以如此,是因为MongoDB用作存档,MyDoc中的实际id
不会是唯一的
在服务类中,我使用MongoTemplate进行如下数据库查询:
List<MyDoc> list = template.findAll(MyDoc.class, "DOCS");
如何将ObjectId转换为Long类型
另外,我当然可以使用java MongoDB驱动程序,但我想减少需要维护的依赖项的数量,因为MongoDB驱动程序附带了启动启动程序数据MongoDB依赖项,并且希望最终能够以更直观的方式,与数据库进行交互,就像与spring数据存储库一样。第一件事是MyDoc的长Id不是唯一的,因此它不能充当mongoDB的_Id。 然后,您需要在您的类中再添加一个_id字段。默认情况下,Spring data mongoDB将把名为id的字段映射到数据库中的_id。
基本上,您可以通过扩展
MyDoc
创建一个包装类,然后添加类型为ObjectId
的新字段,并使用@Id
对其进行注释。通过这种方式,您将拥有唯一的索引,并且mongoTemplate不会尝试将数据库的\u id
转换为长id
如果数据库中的字段是ObjectId,您最好相应地对齐模型。如果你想把它转换成别的东西,也许是字符串?它当然不适合长字符,它是12字节长的。另一种选择是,如果不需要该字段,则完全忽略该字段。您的“真实但非唯一”长id是否存在于文档中的其他位置?
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.bson.types.ObjectId] to type [java.lang.Long]