Spring Data Mongo - Как сделать запрос по идентификатору поля @DBRef

Я новичок в Spring Data Mongo, поэтому, должно быть, я что-то не так делаю, потому что не могу выполнить такой простой запрос. Это моя модель:

@Document(collection="brands")
public class Brand{
    @Id
    private int id;

    private String name;
    ...
    //getters-setters
}

@Document(collection="models")
public class Model{
    @Id
    private int id;
    private String name;
    @DBRef
    private Brand brand;
    ...
    //getters-setters
}

Я хотел бы получить все модели от бренда, поэтому я реализую DAO следующим образом:

@Repository
public interface IModelDAO extends MongoRepository<Model, Integer>{
    @Query(value="{ 'brand.$id' : ?0 }")
    public List<Model> findByBrandId(Integer id);   
}

Если я выполняю этот запрос mongodb в оболочке, он работает: db.modelss.find({ 'brand.$id' : 1 })

Но приложение Java выдает следующее исключение:

Caused by: java.lang.IllegalAccessError
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.java:134)

По-видимому, он ищет поле $ id в классе Brand, и, поскольку оно не существует, происходит сбой. Поэтому я изменил запрос на следующий, чтобы он переместился в поле id:

@Query(value="{ 'brand.id' : ?0 }")

Теперь он не выдает исключение, но ничего не находит в БД.

Отладка метода MongoTemplate.executeFindMultiInternal () позволяет увидеть это в

DBCursor cursor = null;
    try {
        cursor = collectionCallback.doInCollection(getAndPrepareCollection(getDb(), collectionName));

запрос курсора: query={ "brand" : 134}. Так что имеет смысл, что ничего не находит. Изменение значения запроса во время отладки на query = {"brand. $ Id": 134} это работает.

Итак, почему запрос не переведен правильно?

7 голосов | спросил codependent 19 +03002015-10-19T13:02:57+03:00312015bEurope/MoscowMon, 19 Oct 2015 13:02:57 +0300 2015, 13:02:57

2 ответа


0

Проблема была вызвана типом @Id int . Изменение на Integer решило проблему:

@Document(collection="brands")
public class Brand{
    @Id
    private Integer id;

    private String name;
    ...
    //getters-setters
}

@Document(collection="models")
public class Model{
    @Id
    private Integer id;
    private String name;
    @DBRef
    private Brand brand;
    ...
    //getters-setters
}
ответил codependent 22 +03002015-10-22T16:05:42+03:00312015bEurope/MoscowThu, 22 Oct 2015 16:05:42 +0300 2015, 16:05:42
0

попробуйте это;

Query que = new Query();
que.addCriteria(Criteria.where("user.$id").is(new ObjectId("123456789012345678901234")));
ответил Mohammad Badiuzzaman 11 Jpm1000000pmMon, 11 Jan 2016 23:06:59 +030016 2016, 23:06:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132