我有一个现有的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;
}
使用Getters和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
通常我可以看到它仍在使用Object Id进行查询而不是普通的String。
我见过以下建议:
Create a Converter which throws a RuntimeException
但这不起作用;它只是抛出一个RuntimeException。
有关如何使用Spring Data访问已将Ids定义为String的Mongo数据库的任何建议(在现有数据库中)将非常感激。
答案 0 :(得分:0)
我认为这里的问题是错误的&#34; _id&#34;格式,这就是为什么Mongo无法识别具有此ID的任何对象。它应该看起来像 ObjectId (&#34; 528bb0e2e4b0442f1479f1b4&#34;),而不是普通的字符串类型。
{
"_id" : ObjectId("528bb0e2e4b0442f1479f1b4"),
"schoolId" : "URDLKYLFJXLWJGR193778316742298",
"surname" : "Lewis",
"admissionNumber" : "0347",
"firstName" : "Martins"
}
因此,如果您已将包含现有数据的.json导入mongo,则需要更改ID:
"_id": {$oid:"528bb0e2e4b0442f1479f1b4"},
它应该转换为正确的格式。
希望它可以帮助别人。
答案 1 :(得分:0)
您可以按照此处所述为每个存储库使用不同的MongoTemplate
:Configure Multiple MongoDB repositories with Spring Data Mongo
在您不希望从String转换为ObjectId的存储库中,您必须使用缺少ObjectIdToStringConverter
的mongoTemplate
答案 2 :(得分:0)
后面有一个转换器,可以为您方便地进行此转换,如果您希望按原样保留String id,并且不将其转换为ObjectId,则必须重写{{1}中的convertId方法}类,我在这里做了一个例子:
MappingMongoConverter
答案 3 :(得分:-1)
可行的解决方法是为ObjectId创建自己的转换器。
您可以通过提供MappingMongoConverter类型的@Bean来自定义mongo映射器
@Configuration
public class MongoConfig {
@Bean
public CustomConversions customConversions() {
List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>();
converters.add(new MyObjectIdConverter());
return new CustomConversions(converters);
}
@Bean
public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
try {
mappingConverter.setCustomConversions(customConversions());
}
catch (NoSuchBeanDefinitionException ignore) {}
// Don't save _class to mongo
mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
return mappingConverter;
}
}