【问题标题】:How to use Spring JPA for Couchbase nested document values如何将 Spring JPA 用于 Couchbase 嵌套文档值
【发布时间】:2019-10-01 01:00:21
【问题描述】:

我们如何构建 Spring JPA 查询并检索嵌套 Couchbase 文档值的数据? 我试图避免编写本机查询并使用 JPA 方法根据嵌套 2 级的键检索数据。

couchbase 文档值的类型 Company 其中employees 是一个列表,tasks 是employee 下的一个属性,这是一个以详细信息为对象的List

我想查询多个文档并按 categoryId 检索匹配记录。

将存储库接口扩展到 CouchbaseRepository 传递公司和文档 ID。 我尝试过类似

// finding by Employees-->Tasks-->Details-->CategoryId 
findByEmployeesTasksDetailsCategoryId(Integer id); // Does not work

但不起作用

"company": "Xyc",
"employees": {
   "name": "John Smith",
   "age": 24,
   "tasks": [
       {
            "id": 231,
            "date": "05-13-2019"
            "details": {
                    "categoryName": "Software",
                    "categoryId": 12,     
                    "description": "Buy Software"
                    "location": "Plano, Texas"
                    "zip": 75024
                }
            }
        },
       {
            "id": 789,
            "date": "05-14-2019"
            "details": {
                    "categoryName": "Hardware",
                    "categoryId": 17,     
                    "description": "Buy hardware"
                    "location": "Irving, Texas"
                    "zip": 75038
                }
            }
        },
        {
              "id": 456,
              "date": "05-15-2019"
               "details": {
                    "categoryName": "Hardware",
                    "categoryId": 17,     
                    "description": "Buy hardware"
                    "location": "Plano, Texas"
                    "zip": 75024
                 }
        }
    ]
}

我正在寻找JPA方法,我可以通过categoryId获取详细任务或详细信息。

categoryId 17 的预期输出

[
   {
      "categoryName": "Hardware",
      "categoryId": 17,     
      "description": "Buy keyboard and mouse"
      "location": "Irving, Texas"
      "zip": 75038
   },
   {
      "categoryName": "Hardware",
      "categoryId": 17,     
      "description": "Buy monitor"
      "location": "Plano, Texas"
      "zip": 75024
   }

]

【问题讨论】:

    标签: spring jpa spring-data-jpa couchbase n1ql


    【解决方案1】:

    您不能使用 Spring Data 查询嵌套实体,因为它不是原始 Spring Data 规范的一部分。但是,您可以简单地使用 @Query 注释编写 N1QL 查询

    例如:

        @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and companyId = $1 and " +
            " removed = $2 and lower(name) like $3 order by lower(name) asc LIMIT $4 OFFSET  $5 ")
        List<FamilyResource> listFamilies(String companyId, boolean removed, String name, int limit, int offset);
    

    在您的情况下,您可以简单地使用 UNNEST https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/unnest.html

    【讨论】:

    • 如果属性 categoryId 已经存在于父对象中怎么办?这个查询会在嵌套对象上进行吗?
    • 如果 categoryId 是顶级属性,您可以使用标准 Spring Data 语法查询它,但它永远不会尝试将值与嵌套对象匹配。请记住,couchbase 是无模式的,因此查询解析器无法猜测它引用的是嵌套属性。
    • 它怎么知道在3级按属性过滤?
    • 预期回报是多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多