Spring Boot MongoDB @Query注释映射错误

时间:2018-01-11 23:36:49

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

当我这样做时,我得到一个在java对象错误中不存在的属性。我的记录对象有

@Document
public class Record{
    @Field("RecordIdentifier")
    String RecordIdentifier;
    ...
}

我的MongoRepository对象有

public interface RecordRepository extends MongoRepository<Record,String> {

    @Query("{ 'RecordIdentifier' : ?0 }
    public Record findByRecordIdentifier(String RecordIdentifier);

}

在MongoDB中我有

{
    'RecordIdentifier' : 'D'
}

但是当我调用查询方法时

@Autowired
RecordRepository repository

...

repository.findAll();
repository.findByRecordIdentifier("D");

repository.findAll()返回正常并正确映射所有内容,但findByRecordIdentifier()返回错误,指出它无法在Record对象中找到属性'recordIdentifier'。如果我在Record对象中将字段的名称从'RecordIdentifier'更改为'recordIdentifier',它可以正常工作,但为什么我不能将该字段称为'RecordIdentifier'

如果我将Mongo文档更改为

,那真的很奇怪
{
 'Record_Identifier' : 'D'
}

即使查询不再返回任何内容,我仍然会得到相同的错误,因为它现在指向一个不存在的字段。有人可以帮帮我吗?如果需要,我可以提供更多细节。

4 个答案:

答案 0 :(得分:1)

更改字符串this.currentImage; to String RecordIdentifier;并在类中添加getter / setter方法。您的字段声明不符合Java Bean命名标准,因此Reflection无法找到正确的setter方法。

答案 1 :(得分:0)

要了解为什么会发生这种情况,您需要了解spring-data的工作原理。

Spring数据库存储库主要使用方法名称。它根据方法名称创建查询 Spring-data将表示查询以获取findBy(在您的情况下为RecordIdentifier)之后指定的字段。但是在编译时,它会检查您是否提供了有效字段,以便它可以准备正确的查询。它通过检查此字段的实体类(在您的情况下为Record)来实现。

注意:如果字段名称为abc,则必须将方法名称指定为findByAbc(注意大写A)

例如,在您的情况下,如果您只指定此项(不含@Query

 public Record findByRecordIdentifier(String RecordIdentifier);

它将尝试在数据库中搜索字段recordIdentifier

如果您不希望spring-data从方法名称中自行制定查询,那么您可以使用@Query指定现在正在执行的操作。

但是它不起作用的原因是因为你通过指定方法名来混淆spring-data,以便它试图自己制定Query。

解决方案:
1.将字段名称更改为命名约定recordIdentifier。如果你这样做,那么你的存储库方法就不需要@Query了 2.将方法名称(省略findByfindAllBy前缀)更改为

@Query("{ 'RecordIdentifier' : ?0 }
public Record getRecordByRecordIdentifier(String RecordIdentifier);

答案 2 :(得分:0)

如果您不想更改字段名称,其他选项是使用自定义转换器

public class PersonReadConverter implements Converter<Document, Person> {

  public Person convert(Document source) {
    Person p = new Person((ObjectId) source.get("_id"), (String) source.get("name"));
    p.setAge((Integer) source.get("age"));
    return p;
  }
}

使用

注册它们
<mongo:mapping-converter>
  <mongo:custom-converters base-package="com.acme.**.converters" />
</mongo:mapping-converter>

供参考https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.custom-converters

答案 3 :(得分:0)

您忘记在@Query的末尾加上“。请使用

@Query("{ 'RecordIdentifier' : ?0 }")

代替

@Query("{ 'RecordIdentifier' : ?0 })