Spring Data для Couchbase - Подсчет элементов в БД - PullRequest
3 голосов
/ 04 октября 2019

Я недавно использую Spring Data для Couchbase, я определил этот объект

public class Building {

    @NotNull
    @Id
    private String id;

    @NotNull
    @Field
    private String name;

    @NotNull
    @Field
    private String companyId;
}

Я хочу подсчитать все элементы в БД по Id, поэтому я создал эту функцию:

@Repository
@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "building")
public interface BuildingRepository extends CouchbaseRepository<Building, String> {

    @Query("SELECT COUNT(*) AS count FROM #{#n1ql.bucket} WHERE #{#n1ql.filter} and id = $1")
    Long countBuildings(String id);

}

но я получаю 0, сразу после сохранения объекта

Я также пытался

@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} and id = $1")
Long countBuildings(String id);

, но я получил это исключение

org.springframework.data.couchbase.core.CouchbaseQueryExecutionException: Query returning a primitive type are expected to return exactly 1 result, got 0

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Если вы ответите на этот вопрос: Ошибка запроса Couchbase & Spring: «Ожидается, что запрос, возвращающий примитивный тип, вернет ровно 1 результат, получил X»

выглядит так, как будто вынеобходимо вернуть объект, т. е. здание, которое возвращает запрос

, вы также можете обратиться к источнику данных-пружин repoLine 204-209: https://github.com/spring-projects/spring-data-couchbase/blob/master/src/main/java/org/springframework/data/couchbase/repository/query/AbstractN1qlBasedQuery.java#L204

строка 204-209

0 голосов
/ 07 октября 2019

Индексы Couchbase N1QL по умолчанию обновляются асинхронно, поэтому, если вы запрашиваете сразу после вставки элемента, индекс может еще не отражать этот добавленный элемент.

Couchbase предоставляет два необязательных уровня «согласованности сканирования», которыедождитесь, пока индекс достигнет определенной точки согласованности, прежде чем возвращать результаты запроса. Это:

  • at_plus: позволяет вам указать одну или несколько конкретных мутаций, которые требуются для включения в индекс. Это очень полезно для сценариев «Читайте свои собственные записи».
  • request_plus: когда запрос приостанавливается до тех пор, пока все остающиеся на момент запроса мутации не будут в индексе.

(Здесь есть более подробная информация: https://docs.couchbase.com/server/5.5/indexes/performance-consistency.html)

Что касается того, как применить это в мире Spring, вы можете указать последовательность сканирования следующим образом:

@WithConsistency(ScanConsistency.REQUEST_PLUS)
@Query("SELECT COUNT(*) AS count FROM #{#n1ql.bucket} WHERE #{#n1ql.filter} and id = $1")
Long countBuildings(String id);

Пожалуйста, смотрите https://docs.spring.io/spring-data/couchbase/docs/current/reference/html/#couchbase.repository.consistency для получения более подробной информации.

...