在spring中编写自定义n1ql查询

时间:2016-03-14 11:00:14

标签: spring-data couchbase spring-data-couchbase

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

1 个答案:

答案 0 :(得分:2)

查询看起来不错。您确实使用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和{的目的{1}} SpEL)。
  2. #n1ql.filter更自由形式。如果杰克逊可以将提供的查询的结果反序列化到所请求的类,那么它将会。因此,SELECT方法在此方法中的隐式限制要少得多。
  3. 要同时使用这两者,您必须从SDK传入findByN1QLProjection对象。可以使用N1qlQuery类的工厂方法构造此类查询,例如:

    N1qlQuery