【问题标题】:Spring data Couchbase #n1ql.fields querySpring data Couchbase #n1ql.fields 查询
【发布时间】:2018-03-01 19:54:36
【问题描述】:

我正在尝试在 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错误,无法执行查询: {"msg":"语法错误 - 在 AS","code":3000}

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

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

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

 this.userRepository.findAllByFields("firstName");

有人知道怎么做这样的查询吗?

提前谢谢你。

【问题讨论】:

    标签: couchbase n1ql spring-data-couchbase


    【解决方案1】:

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

    查找所有用户(以及他们存储的所有数据)

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

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

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

    查找所有喜欢 firstName 的用户

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

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

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


    在它说的文档中注意

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

    等价于

    从 #{#n1ql.bucket} 中选择 #{#n1ql.fields} #{#n1ql.filter} AND 测试 = $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

    【讨论】:

    • 您发布的文档对我帮助很大。最后我明白 Spring Data 不支持它,唯一的选择是使用投影。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多