当我这样做时,我得到一个在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'
}
即使查询不再返回任何内容,我仍然会得到相同的错误,因为它现在指向一个不存在的字段。有人可以帮帮我吗?如果需要,我可以提供更多细节。
答案 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.将方法名称(省略findBy
和findAllBy
前缀)更改为
@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 })