首页 文章

Spring数据Couchbase#n1ql.fields查询

提问于
浏览
0

我正在尝试在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字段时,我得到了所有文档,但只有其他字段设置为null的ID .

this.userRepository.findAllByFields("firstName");

谁知道怎么做这样的查询?

先感谢您 .

1 回答

  • 0

    你误解了这个概念,我鼓励你给文档更多时间,看看更多的例子 . 我不确定你到底想要实现什么,但我会举一些例子 .

    Find all users (with all of their stored data)

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

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

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

    Find all users where firstName like

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

    这将产生类似上面的查询,但有一个额外的条件 firstName like

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


    请注意文档中的说明

    WHERE#{#n1ql.filter} AND test = $ 1相当于SELECT# FROM# WHERE# 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

相关问题