Couchbase的Spring数据-DB中的计数元素

问题描述 投票:3回答:2

我是使用Spring Data for 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
spring-boot spring-data-jpa couchbase spring-data-couchbase couchbase-java-api
2个回答

0
投票

默认情况下,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了解更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.