MongoTemplate 与 MongoCollection 查询结果的 toString 问题

date
Nov 10, 2023
slug
MongoTemplate_toString_problems_with_MongoCollection_query_results
status
Published
tags
Java
Spring学习
MongoDB
NoSQL
summary
type
Post
category
 

背景

这段代码的输出结果百思不得其解。
输出结果:
前两个查询使用的是 MongoCollection,第三个查询使用的是 Spring Data 的 MongoTemplate 。在 debug 中明显可以看到 res1 是有值的,与 res2 、 res3 是一样的值,但是一 sout 就没内容,全是初始值。
Person 类:
 

解惑

Person 类中的 Data 注解写了个普通的 toString,用的是把各个属性给塞进字符串的style,而 MongoDB 的 Document 中的 toString 使用的是 Document 类的私有属性 documentAsMap ,这个属性是一个 LinkedHashMap。
所以 System.out.println(res1.get(0)); 输出的都为 null 与 0 是因为使用的 lombok Data 自动写的 toString 无法获取真实的 Document 属性值,解决方法就是在 Person 类中添加注解 ToString(callSuper = true) 或重写 toString。
也可以使用 DTO 接收查询结果。
 

还有疑问🤔

为什么开头的 List<Person> res3 = mongoTemplate.find(new Query(), Person.class); 可以正确输出呢,我没找到资料,姑且猜测是 Spring Data MongoDB 在底层查询的时候返回的是 Document 并且在映射查询结果时如果实体类父类是 Document 类就直接返回。
 
 
 
 

© Rysi 2018 - 2025