Spring 数据 Couchbase #n1ql.fields 查询

Spring data Couchbase #n1ql.fields query

我正在尝试在 Spring Data Couchbase 上进行基于 N1QL 的查询。文件说

#n1ql.fields will be replaced by the list of fields (eg. for a SELECT clause) necessary to reconstruct the entity.

我的存储库实现是这个:

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

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

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

我收到这个错误:

Caused by: org.springframework.data.couchbase.core.CouchbaseQueryExecutionException: Unable to execute query due to the following n1ql errors: {"msg":"syntax error - at AS","code":3000}

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

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

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

 this.userRepository.findAllByFields("firstName");

有人知道如何进行这样的查询吗?

提前致谢。

你误解了这个概念,我鼓励你给文档更多时间并查看更多示例。我不确定你到底想达到什么目的,但我会举一些例子。

查找所有用户(及其所有存储的数据)

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

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

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

查找名字喜欢

的所有用户
@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND firstName like ")
List<User> findByFirstNameLike(String keyword);

这将生成类似于上述查询的内容,但带有额外的 where 条件 firstName like

请注意此方法需要一个关键字,因为定义了一个参数占位符


文档中的注意事项

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

is equivalent to

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


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

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