我正在尝试使用 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注释是否正确?
另外,如何在模板上执行 n1QL 查询CouchbaseOperations
?我知道有一种findByN1QL
方法,但我没有找到任何关于它的好文档。有人可以解释如何使用它吗?
查询看起来正常。您确实使用Spring Data Couchbase存储库持久化了GsJsonStore
实体,是吗?
为了记录框架生成和执行的所有查询(包括像您这样的内联查询),您可以在logback.xml
配置中这样配置记录器:
<logger name="org.springframework.data.couchbase.repository.query" level="debug"/>
您将看到执行的查询和您在 cbq 中运行的查询并不相同,因为至少您没有使用 WHERE 子句。
在CouchbaseOperations
中,有两种相对于 N1QL 查询的方法:
-
findByN1QL
:这需要查询的特定结构,以确保选择更正 Spring 数据注释实体反序列化所需的所有数据(这是#n1ql.selectEntity
和#n1ql.filter
SpEL 的目的)。 -
findByN1QLProjection
更自由的形式。如果 Jackson 可以将提供的查询结果反序列化为请求的类,那么它将。因此,SELECT 子句在此方法中的隐式限制要少得多。
若要同时使用两者,必须从 SDK 传入N1qlQuery
对象。可以使用 N1qlQuery
类的工厂方法构造此类查询,例如:
//a version of the query that is constructed from positional parameters
N1qlQuery queryWithParameter = N1qlQuery.parameterized("SELECT name FROM `beer-sample` WHERE name LIKE $0", JsonArray.from("%dog%"));
//let Spring Data execute the query, projecting to the String class
List<String> beerNamesContainingDog = template.findByN1QLProjection(queryWithParameter, String.class);