Spring数据Couchbase#n1ql.fields查询

时间:2017-09-20 16:33:23

标签: couchbase n1ql spring-data-couchbase

我试图在Spring Data Couchbase上进行基于N1QL的查询。文档说

  

#n1ql.fields将被重建实体所需的字段列表(例如,用于SELECT子句)替换。

我的存储库实现就是这个:

@Query("#{#n1ql.fields} WHERE #{#n1ql.filter}")
List<User> findAllByFields(String fields);

我正在按如下方式调用此查询:

this.userRepository.findAllByFields("SELECT firstName FROM default");

我收到此错误:

  

引起:org.springframework.data.couchbase.core.CouchbaseQueryExecutionException:由于以下n1ql错误,无法执行查询:   {&#34; msg&#34;:&#34;语法错误 - 在AS&#34;,&#34;代码&#34;:3000}

经过一番研究,我也尝试了:

@Query("SELECT #{#n1ql.fields} FROM #{#n1ql.bucket} WHERE #{#n1ql.filter}")

使用此查询,我没有收到错误,当我的查询尝试获取firstName字段时,我将所有文档都存储但只有其他字段设置为null的ID。

 this.userRepository.findAllByFields("firstName");

任何人都知道如何进行此类查询?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您误解了这个概念,我鼓励您为文档提供更多时间并查看更多示例。我不确定你究竟想要实现什么,但我会举一些例子。

查找所有用户(包含所有存储的数据)

@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter}")
List<User> findAllUsers();

这基本上会生成SELECT meta().id,_cas,* FROM bucket WHERE type='com.example.User'

注意findAllUsers()不接受任何参数,因为上面的@Query中没有定义param占位符。

查找firstName喜欢的所有用户

@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND firstName like $1")
List<User> findByFirstNameLike(String keyword);

这将生成类似于上述查询的内容,但在条件firstName like

的情况下会有额外的内容

请注意,此方法采用关键字,因为定义了一个param占位符$1

在文档中注明

  

#{#n1ql.selectEntity} WHERE#{#n1ql.filter} AND test = $ 1

     

相当于

     

SELECT#{#n1ql.fields} FROM#{#n1ql.bucket} WHERE   #{#n1ql.filter} AND test = $ 1

现在,如果您不想获取用户的所有数据,则需要指定所选字段,请阅读以下链接以获取更多信息

How to fetch a field from document using n1ql with spring-data-couchbase

https://docs.spring.io/spring-data/couchbase/docs/2.2.4.RELEASE/reference/html/#_dto_projections