在春季编写自定义 n1ql 查询



我正在尝试使用 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 查询的方法:

  1. findByN1QL :这需要查询的特定结构,以确保选择更正 Spring 数据注释实体反序列化所需的所有数据(这是 #n1ql.selectEntity#n1ql.filter SpEL 的目的)。
  2. 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);

最新更新