如何在没有ObjectId

时间:2015-11-19 16:13:50

标签: java spring-boot spring-data spring-data-mongodb

我有一个现有的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数据库的任何建议(在现有数据库中)将非常感激。

4 个答案:

答案 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)

您可以按照此处所述为每个存储库使用不同的MongoTemplateConfigure 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;
    }

}