【发布时间】:2016-02-21 21:32:39
【问题描述】:
我有一个现有的 mongo 数据库,其中 id (_id) 被持久化为纯字符串。这是 Mongo DB 中的示例数据:
{
"_id" : "528bb0e2e4b0442f1479f1b4",
"schoolId" : "URDLKYLFJXLWJGR193778316742298",
"surname" : "Lewis",
"admissionNumber" : "0347",
"firstName" : "Martins"
}
我有一个 Java 对象,其形式为:
public class Student {
@Id
private String id;
private String schoolId;
private String surname;
private String admissionNumber;
private String firstName;
}
使用 Getter 和 Setter
我也有一个仓库:
public interface StudentRepository extends MongoRepository<Student, String> {
Student findOneBySurname(String surname);
Student findOneById(String id);
Student findOneBySurnameAndFirstName(String surname, String firstName);
}
当我执行 studentRepository.findAll() 时,我能够获取数据库中的所有学生,并且所有字段都正确填充。
当我执行 studentRepository.findOne("528bb0e2e4b0442f1479f1b4") 或 studentRepository.findOneById)"528bb0e2e4b0442f1479f1b4") 时,它返回 null
当我对 mongo 查询进行调试时,我可以看到它正在调用:
2015-11-19 16:06:32.327 DEBUG 87081 --- [ main] o.s.data.mongodb.core.MongoTemplate : findOne using query: { "id" : "528bb0e2e4b0442f1479f1b4"} fields: null for class: class com.ad.josh.domain.Student in collection: Student
2015-11-19 16:06:32.331 DEBUG 87081 --- [ main] o.s.data.mongodb.core.MongoDbUtils : Getting Mongo Database name=[joshdb]
2015-11-19 16:06:32.333 DEBUG 87081 --- [ main] o.s.data.mongodb.core.MongoTemplate : findOne using query: { "_id" : { "$oid" : "528bb0e2e4b0442f1479f1b4"}} in db.collection: josh.Student
通常我可以看到它仍在使用对象 ID 而不是普通字符串进行查询。
我看到了以下建议:
Create a Converter which throws a RuntimeException
但这不起作用;它只是抛出一个 RuntimeException。
任何关于如何使用 Spring Data 访问 Id 已经定义为 String 的 Mongo 数据库(在现有数据库中)的建议将不胜感激。
【问题讨论】:
-
这个看起来很像 Spring Data MongoDB 中的一个错误,因为
QueryMapper将任何有效的String转换为ObjectId为ObjectId(请参阅:QueryMapper#convertId)。我创建了DATAMONGO-1333 来对此进行调查。 -
感谢@ChristophStrobl,这有助于了解
-
相当于expected and documented。作为有效 ObjectIds 的字符串在数据库中保持不变。是否愿意提供一个测试用例来显示存储库查询未返回刚刚持久化实例的实例?
-
所以@OliverGierke如果一个对象(Java)的id是一个字符串并且是持久化的,它会使用ObjectId保存到数据库中,如果你继续通过提供id来返回一个实例它返回的字符串很好。但是问题是存在一个现有数据库,其 id 未在 MongoDB 中存储为 ObjectId。如果继续使用 id (As String) 进行查询,它会返回 null,因为它期望 MongoDB 有使用 ObjectIds 存储的记录(虽然它存储在纯字符串中)
标签: java spring-boot spring-data spring-data-mongodb