我完全走错了路吗? 这有用吗?
我正在尝试构建一个基于布尔值限制选择的查询
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"}
答案 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));