我试图在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");
任何人都知道如何进行此类查询?
提前谢谢。
答案 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