我使用了以下代码:Error creating bean with name 'personRepository': Invocation of init method failed; nested exception is com.mongodb.util.JSONParseException:,现在试着打电话
Person p = personRepository.findByAddresses_City("London NW1");
System.out.println("PERSON FOR ADDRESS = "+p);
我得到空响应。
此外,下面的查询不会拉任何东西。
Query query = new Query(Criteria.where("address.$id").is(2L));
List<Person> l = mongoTemplate.find(query, Person.class);
System.out.println(l);
这里:
db.getCollection( '地址')。找到({})
/* 1 */
{
"_id" : NumberLong(1),
"address" : "221b Baker Street",
"city" : "London NW1",
"state" : "London",
"zipcode" : NumberLong(12345),
"_class" : "com.example.demo.model.Address"
}
和db.getCollection('person').find({})
/* 1 */
{
"_id" : NumberLong(1),
"name" : "Achilles",
"age" : 0,
"addresses" : [],
"_class" : "com.example.demo.model.Person"
}
/* 2 */
{
"_id" : NumberLong(2),
"name" : "Hektor",
"age" : 0,
"addresses" : [
{
"$ref" : "address",
"$id" : NumberLong(1),
"$db" : "address"
}
],
"_class" : "com.example.demo.model.Person"
}
如何解决这个错误?
@Document(collection = "address")
public class Address {
@Id
private long addressId;
private String address;
private String city;
private String state;
private long zipcode;
public Address() {
System.out.println("CAlling default cons");
}
@PersistenceConstructor
public Address(long addressId, String address, String city, String state, long zipcode) {
this.addressId = addressId;
this.address = address;
this.city = city;
this.state = state;
this.zipcode = zipcode;
}
// setter and getter... toString()..
}
和
@Document
public class Person {
@Id
private Long personId;
private String name;
private int age;
@DBRef(db = "address")
private List<Address> addresses = new ArrayList<>();
public Person() {
}
@PersistenceConstructor
public Person(Long personId, String name, int age) {
super();
this.personId = personId;
this.name = name;
this.age = age;
}
// setter, getter and toString
}
这按设计工作。 MongoDB不允许通过查询进行应用程序级别连接,您需要使用聚合框架来进行更复杂的查询。因此,存储库查询只允许通过完整值(即Address
对象)或标识符来查找DBRef。
如果您将where子句修复为address.addressId
,则第二个示例应该有效。
P.S。:请避免因为您没有立即得到答案而提交门票。如果您提交了故障单,请务必附上带有测试用例的示例项目。