我尝试使用N1QL查询查询spring-data couchbase存储库。我有两个疑问:
我使用@Query注释生成查询,我的代码如下所示:
@Query("#{#n1ql.selectEntity} WHERE $0 = $1 AND #{#n1ql.filter}")
public Page<GsJsonStore> matchJson(String term, String value, Pageable pageable);
//Query
Page<GsJsonStore> p = repo.matchJson("_object.details.status", "ready", pg);
此查询不会返回任何结果。但是,当我在cbq中运行相同的查询(下面)时,我得到了所需的结果:
select * from default where _object.details.status = 'ready';
如何查看Couchbase存储库生成的查询字符串?我使用的是弹簧靴。我是否正确使用@Query注释用于此用例?
另外,如何在CouchbaseOperations
模板上执行n1QL查询?我知道有findByN1QL
方法,但我没有找到任何关于它的好文档。有人可以解释一下如何使用它吗?
答案 0 :(得分:2)
查询看起来不错。您确实使用Spring Data Couchbase存储库保留了GsJsonStore
个实体吗?
为了记录框架生成和执行的所有查询(包括您的情况下的内联查询),您可以在logback.xml
配置中配置记录器:
<logger name="org.springframework.data.couchbase.repository.query" level="debug"/>
您会看到执行的查询和您在cbq中运行的查询不一样,因为至少您没有使用WHERE子句。
在CouchbaseOperations
中,有两种方法相对于N1QL查询:
findByN1QL
:这需要查询的特定结构,以确保选择正确反序列化Spring数据注释实体所需的所有数据(这是#n1ql.selectEntity
和{的目的{1}} SpEL)。#n1ql.filter
更自由形式。如果杰克逊可以将提供的查询的结果反序列化到所请求的类,那么它将会。因此,SELECT方法在此方法中的隐式限制要少得多。要同时使用这两者,您必须从SDK传入findByN1QLProjection
对象。可以使用N1qlQuery
类的工厂方法构造此类查询,例如:
N1qlQuery