Spring Data Couchbase findById始终返回null

时间:2017-02-07 01:16:49

标签: spring-data spring-data-couchbase

我完全走错了路吗? 这有用吗?

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

e.g。 findByIdAndFieldIsTrue(id)

这始终不返回任何值。如果我缩小范围,只做findById(id)我仍然没有得到任何看似奇怪的结果。我尝试了一些Id& amp;的排列。方法名称中的字段但不起作用。

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"}

2 个答案:

答案 0 :(得分:2)

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

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

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

我知道如果反序列化很复杂,效果不会很好,但解决方法可能是使用findOne然后检查字段。

答案 1 :(得分: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));