3

我是使用 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
4

2 回答 2

1

如果您参考这个问题:Couchbase & Spring 查询错误:“返回原始类型的查询预计会返回 1 个结果,得到 X”

看起来您需要返回查询返回的对象,即 Building

你也可以参考spring-data-couchbase 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 行

于 2019-10-04T16:21:04.870 回答
1

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

于 2019-10-07T10:47:57.777 回答