Репозиторий использует N1QL

Я получаю следующее исключение:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'answerRepository': Invocation of init method failed; nested exception is org.springframework.data.couchbase.core.UnsupportedCouchbaseFeatureException: Repository uses N1QL

Я использую Spring 4.2.0.RELEASE с spring-data-couchbase 2.0.0.M1 против корпоративной версии Couchbase 2.5.1 (сборка-1083)

Я не вижу никакого объяснения этой ошибки в документе.

Вот репозиторий:

public interface AnswerRepository extends BaseRepository<Answer, String> {

  final static String DESIGN_DOCUMENT = "answers";

  @View(viewName = "answers_by_quizId_startTime", designDocument = DESIGN_DOCUMENT)
  public List<Answer> findByQuizIdAndStartTime(String quizId, long startTime);

  Answer findByUuid(String uuid);

}

@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends CrudRepository<T, ID>  {
}

Возможно, мой сервер Couchbase не поддерживает эту функцию, тогда как мой репозиторий ее ожидает.

Мне может понадобиться кодировать мой репозиторий по-другому.

Жаль, что здесь не сказано, какой метод является недопустимым.

Или это мое использование CrudRepository в базовом классе?

Интересно, как узнать, какие представления он ожидает найти на моем сервере Couchbase.


person Stephane    schedule 15.12.2015    source источник


Ответы (1)


Репозитории в Spring Data Couchbase 2.0 полагаются почти исключительно на Views и N1QL. Большая часть новых функций в этой версии стала возможной благодаря N1QL, который теперь является механизмом по умолчанию, который Spring Data использует для таких вещей, как «вывод запроса» (реализация метода репозитория путем создания некоторого типа запроса, полученного из имени метода ).

Couchbase Server 2.5.1 не имеет доступа к N1QL (который поставлялся с Couchbase Server 4.0 и, конечно же, в совершенно новой версии 4.1).

Если вы хотите, чтобы Spring Data реализовал для вас findByUuid, вам придется аннотировать этот метод с помощью @View и создать соответствующее представление, которое генерирует uuid из ваших Answer документов.

Производные запросы просмотра сильно ограничены и требуют больше работы, поскольку вам нужно написать правильный map function:

  • метод репозитория, основанный на представлении, может запрашивать только один критерий.
  • вы должны правильно создать свое представление, испуская правильные ключи, соответствующие критериям, с которыми вы будете запрашивать.
  • вам необходимо создать одно представление для каждого класса сущности, ограничивая представление представлением только в том случае, если поле «_class» в JSON соответствует указанной сущности (примечание: это поле можно переименовать в конфигурации, поэтому обязательно используйте соответствующий).

Значит, ваш findByQuizIdAndStartTime тоже не работает. Возможно, вам придется реализовать это (и, возможно, findByUuid) в BaseRepository, полагаясь на CouchbaseTemplate и используя его метод findByView (или даже queryView в крайнем случае).

UnsupportedCouchbaseFeatureException упоминается в главе 7 документа M1 (в запросы на основе N1QL).

См. также раздел просмотреть вывод запроса далее в документации.

person Simon Baslé    schedule 16.12.2015
comment
Могу ли я по-прежнему получать прибыль от класса CrudRepository, используя эти версии Couchbase 2.5.1 и SDC 2.0.0.M1? Скажите, если я исправлю методы репозитория. Или мне нужно вернуться к более старой версии SDC. Как и сейчас, я получаю исключение java.lang.StackOverflowError: null, если делаю answer0 = answerRepository.save(answer0); в своем тесте. - person Stephane; 27.12.2015