如何将Spring JPA用于Couchbase嵌套文档值
我们如何构建SpringJPA查询并检索嵌套Couchbase文档值的数据? 我试图避免编写本机查询,并使用JPA方法基于嵌套在两个级别上的键检索数据 couchbase文档值的类型为 公司 其中,employees是一个列表,tasks是employees下的一个属性,employees是一个以详细信息为对象的列表 我想查询多个文档并按categoryId检索匹配的记录 将存储库接口扩展到CouchbaseRepository传递公司和文档id。 我试过类似的东西如何将Spring JPA用于Couchbase嵌套文档值,spring,jpa,spring-data-jpa,couchbase,n1ql,Spring,Jpa,Spring Data Jpa,Couchbase,N1ql,我们如何构建SpringJPA查询并检索嵌套Couchbase文档值的数据? 我试图避免编写本机查询,并使用JPA方法基于嵌套在两个级别上的键检索数据 couchbase文档值的类型为 公司 其中,employees是一个列表,tasks是employees下的一个属性,employees是一个以详细信息为对象的列表 我想查询多个文档并按categoryId检索匹配的记录 将存储库接口扩展到CouchbaseRepository传递公司和文档id。 我试过类似的东西 // finding by
// 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获得详细任务或详细信息
类别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数据查询嵌套实体,因为它不是原始Spring数据规范的一部分。但是,您可以简单地使用@Query注释编写N1QL查询 例:
在您的情况下,您可以简单地使用UNNEST如果父对象中已经存在属性categoryId怎么办?如果categoryId是顶级属性,您可以使用标准Spring数据语法进行查询,但它永远不会尝试将值与嵌套对象匹配。记住couchbase是无模式的,因此查询解析器无法猜测它引用了嵌套属性。它如何知道在第3级按属性进行过滤?预期的返回是什么?
@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);