Работа с не пружинными документами данных в couchbase - PullRequest
0 голосов
/ 18 марта 2019

Есть ли рекомендуемый способ работы с документами, у которых нет поля _class с spring-data-couchbase (если есть)?Попытка просто выдает исключение, как и ожидалось.

Редактировать: Извинения, если это было слишком расплывчато, позвольте мне добавить немного больше контекста.Скажем, я хочу получить данные из couchbase для какого-то студента по имени.Репозиторий выглядит примерно так -

@ Repository

открытый интерфейс StudentRepository расширяет CouchbaseRepository {

Optional<StudentDocument> findByName(String name);

}

Теперь документы в couchbase непусть поле _class ИЛИ скажет, если мы вводим разные «ключ» и «значение» для поля _class, поскольку мы не хотим на него полагаться, поэтому этот метод завершается ошибкой.Я вроде взломал обходной путь для этого, используя -

`

@Override
public Student getStudent(String name) {
    N1qlQuery query = N1qlQuery.simple(String.format("select *, META().id AS _ID, META().cas AS _CAS" +
            " from student where name = \'%s\';", name));
    return Optional.ofNullable(studentRepository.getCouchbaseOperations()
            .findByN1QL(query, StudentWrapper.class)
            .get(0))
            .map(StudentWrapper::getStudent)
            .orElseGet(() -> {
                throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
            });
}

`

Мне было интересно, есть ли альтернативный способ достижения этого

1 Ответ

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

При использовании Spring spEL Couchbase автоматически включает для вас _class (или любой атрибут, который вы определили как ваш тип):

public interface AreaRepository extends CouchbaseRepository<Area, String> {
   //The _class/type is automatically included by Couchbase 
    List<Area> findByBusinessUnityIdAndRemoved(String businessId, boolean removed);
}

Однако, если вы хотите использовать N1QL, вам нужно добавить# {# n1ql.filter}:

public interface BusinessUnityRepository extends CouchbaseRepository<BusinessUnity, String>{

    @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and companyId = $2 and $1 within #{#n1ql.bucket}")
    BusinessUnity findByAreaRefId(String areaRefId, String companyId);

}

# {# n1ql.filter} автоматически добавит фильтр по типу для вас.

...