spring-boot - Couchbase 的 Spring Data - 数据库中的计数元素

标签 spring-boot spring-data-jpa couchbase spring-data-couchbase couchbase-java-api

我刚开始使用 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

最佳答案

默认情况下,Couchbase N1QL 索引是异步更新的,因此如果您在插入一个项目后立即查询,索引可能还没有反射(reflect)该添加的项目。

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了解更多详情。

关于spring-boot - Couchbase 的 Spring Data - 数据库中的计数元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58236848/

相关文章:

java - Spring boot @Caching 具有多个键

java - RestTemplate Junit : Cannot invoke "org.springframework.http.ResponseEntity.getBody()" because "response" is null

java - 组织.postgresql.util.PSQLException : ERROR: syntax error at or near ":"

spring - @DomainEvents和@AfterDomainEventsPublication的示例

java - Couchbase Java API 不返回设定范围的值

android - 在复制期间在 couch base lite 的 android 模拟器中获取 http 404 错误

spring-boot - 使用数据库 H2 在 Spring Boot 中进行测试

尝试创建新对象并将其添加到 Arraylist 时出现 Java JPA LazyInitializationException

c# - 使用Couchbase时发生类型转换错误

java - 如何在端口 80 上运行 Spring Boot 应用程序