@DBRef не извлекает данные при использовании Spring Data Mongo - PullRequest
0 голосов
/ 28 марта 2019

Я использовал код из: Ошибка создания компонента с именем personRepository: сбой вызова метода init;вложенное исключение - 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 ('address'). Find ({})

/* 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
}

1 Ответ

0 голосов
/ 29 марта 2019

Это работает как задумано. MongoDB не разрешает присоединения на уровне приложений с помощью запросов, вам нужно использовать структуру агрегации для более сложных запросов. Таким образом, запросы к репозиторию позволяют находить DBRef только по полному значению (т.е. Address объектам) или идентификаторам.

Второй пример должен работать, если вы исправите предложение where в address.addressId.

P.S .: Пожалуйста, избегайте подачи билетов только потому, что вы не сразу получите ответ здесь. Если вы подаете заявку, обязательно приложите образец проекта с тестовым набором.

...