Как я могу получить данные из документа @DBRef, используя @Query -> Spring data mongo - PullRequest
1 голос
/ 27 марта 2020

Мне нужна помощь, чтобы получить данные из другого документа. У меня есть следующий класс.

@Data
@Document(collection = "tmVersion")
public class TmVersion {

    @Id
    private String id;

    private String cVrVersionId;

    @DBRef
    private TaApplicationVersion taApplicationVersion;
}

и

@Data
@Document(collection = "taApplicationVersion")
public class TaApplicationVersion {

    @Id
    private String id;

    private String dVrAppName;

    private String dVrAppCode;

}

Это мой репозиторий, в котором я отображаю то, что хочу но в taApplicationVersion мне нужно показать весь этот объект и как это делается?

@Query(value="{}", fields="{'cVrVersionId': 1, 'taApplicationVersion.dVrAppName': 2, 
'dVrVersionNumber': 3}") 
Page<TmVersion> getAllVersionWithOutFile(Pageable pageable)

1 Ответ

0 голосов
/ 27 марта 2020

Несколько вещей, чтобы упомянуть здесь.

  1. Если вы хотите такого рода объединения таблиц, вам нужно переосмыслить выбор Mongodb в качестве базы данных. Нет Sql Базы данных процветают благодаря тому факту, что связь между таблицами (коллекциями) очень мала. Так что, если вы используете @DBRef, это отрицает это. Сами Mongodb не рекомендуют использовать @DBRef.

  2. Этого нельзя добиться с помощью метода, подобного тому, который вы использовали в хранилище. Вам нужно использовать проекции. Здесь - документация для этого.
    Создайте подобный интерфейс Porjection. Здесь вы можете указать, какие поля необходимо включить в основной класс (TmVersion)

    @ProjectedPayload
    public interface TmVersionProjection {
    
      @Value("#{@taApplicationVersionRepository.findById(target.taApplicationVersion.id)}")
      public TaApplicationVersion getTaApplicationVersion();
      public String getId();
      public String getcVrVersionId();
    }
    

Изменить TmVersionRepository следующим образом:

public interface TmVersionRepository extends MongoRepository<TmVersion, String> {

    @Query(value="{}")
    Page<TmVersionProjection> getAllVersionWithOutFile(Pageable pageable);
}

Создать новый репозиторий для TaApplicationVersion. Вы можете добавить @Query поверх этого метода и контролировать, какие поля из подкласса должны быть возвращены.

public interface TaApplicationVersionRepository extends MongoRepository<TaApplicationVersion, String> {
      TaApplicationVersion findById(String id);
}
...