1

我正在尝试使用 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方法,但我没有找到任何关于它的好文档。有人可以解释一下如何使用它吗?

4

1 回答 1

2

查询看起来没问题。您确实GsJsonStore使用 Spring Data Couchbase 存储库持久化了您的实体,是吗?

为了记录框架生成和执行的所有查询(包括您的情况下的内联查询),您可以在配置中像这样配置记录器logback.xml

<logger name="org.springframework.data.couchbase.repository.query" level="debug"/>

您会看到执行的查询和您在 cbq 中运行的查询并不相同,因为至少您没有使用 WHERE 子句。

CouchbaseOperations两种与 N1QL 查询相关的方法:

  1. findByN1QL:这需要查询的特定结构,以确保选择正确反序列化 Spring Data 注释实体所需的所有数据(这是SpEL 的目的)#n1ql.selectEntity#n1ql.filter
  2. findByN1QLProjection形式更自由。如果杰克逊可以将提供的查询结果反序列化到请求的类,那么它将。因此,SELECT 子句在此方法中的隐含限制要少得多。

要同时使用两者,您必须N1qlQuery从 SDK 传入一个对象。可以使用类的工厂方法构造此类查询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);
于 2016-03-14T13:29:07.933 回答