1

我是否完全走错了路?这应该工作吗?

我正在尝试构建一个基于布尔值限制选择的查询

例如findByIdAndFieldIsTrue(id)

这总是不返回任何值。如果我缩小这个范围,findById(id)我仍然没有得到看起来很奇怪的结果。我在方法名称中尝试了许多 Id 和字段的排列,但没有一个起作用。

Entity {
  @Id
  String id
  boolean field
}

interface EntityRepository BaseRepository, Repository {
  findByIdAndFieldIsTrue(id)
}

我不假思索地尝试BaseRepository了 findOne 方法,但没有运气。

更新:

添加答案中建议的记录器后,我可以获得查询

{"statement":"SELECT META(`mybucket`).id AS _ID, META(`mybucket`).cas AS _CAS, `mybucket`.* FROM `mybucket` WHERE (`id` = \"entity::9627ff50-531d-4191-a9dc-07b48ba77fe9\") AND `_class` = \"com.myrepo.repository.api.Entity\"","scan_consistency":"statement_plus"}
4

2 回答 2

2

编辑:N1QL 强制您使用 USE KEY 构造按 id 选择...这将更难集成,看起来解决方法是最简单的路径(见下文)

我认为这是对@Id现场查询推导的忽视。在 Couchbase 中,该字段映射到文档的键并且不包含在文档的正文中,因此 N1QL 查询需要考虑到这一点。

您可以为查询生成激活日志记录吗?有一个AbstractN1qlBasedQuery.class记录器可以在模式下记录生成的 N1QL DEBUG。它将允许我们查看查询的样子并确认必须对 @Id 字段采取特殊步骤...

我知道如果反序列化很复杂,它的性能就不会那么好,但是一种解决方法可能是使用findOne然后检查该字段。

于 2017-02-08T18:20:12.933 回答
0

得到这个与以下工作:

@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND META(#{#n1ql.bucket}).id IN $1")
List<Entity> findByIdIn(JsonArray ids);

要从JsonArray列表中获取,请执行以下操作:

import com.couchbase.client.java.document.json.JsonArray;
.
.
.
repository.findByIdIn(JsonArray.from(myList));
于 2019-10-23T12:38:55.467 回答