Spring boot 如何使用反应式couchbase获取对象的嵌套列表?
我最近开始回顾/学习一些关于反应式couchbase的知识,我正在尝试使用该技术和spring data和spring boot实现一个示例,我有以下模型:Spring boot 如何使用反应式couchbase获取对象的嵌套列表?,spring-boot,spring-data,reactive-programming,couchbase,Spring Boot,Spring Data,Reactive Programming,Couchbase,我最近开始回顾/学习一些关于反应式couchbase的知识,我正在尝试使用该技术和spring data和spring boot实现一个示例,我有以下模型: @Document public class Person { @Id private String id; @Field private String name; @Field private String lastName; @Field private List<A
@Document
public class Person {
@Id
private String id;
@Field
private String name;
@Field
private String lastName;
@Field
private List<Address> address;
// Getters & Setters
}
@Document
public class Address {
@Id
private String code;
@Field
private String mainStreet;
@Field
private String secondStreet;
// Getters & Setters
}
当我呼叫服务时,例如:http://localhost:8080/sample_couchbase/person/1/addresses
我想得到这个:
"address": [
{
"code": "A1",
"mainStreet": "AAA",
"secondStreet": "BBB",
"phone": "11111",
"place": "home"
},
{
"code": "A2",
"mainStreet": "CCC",
"secondStreet": "DDD",
"phone": "22222",
"place": "work"
},
{
"code": "A3",
"mainStreet": "EEE",
"secondStreet": "FFF",
"phone": "33333",
"place": "treasury"
}
]
我设想在存储库中创建一个类似以下内容的方法:
Mono<Person> findById(String id);
Mono-findById(字符串id);
在服务层,我想象得到整个对象,然后按地址过滤,但这与我以前的做法有所不同,现在我使用Mono和Flux,而不是简单的对象或列表,所以我不知道怎么做,有人能给我一个主意吗?还是有更好的解决方案?我找到了一种简单的方法来检索特定人员的地址,我使用了一个查询,其中我指定了要检索的内容:
@Query("SELECT addresses, META(sample).id as _ID, META(sample).cas as _CAS FROM `sample` WHERE id = $1")
Flux<Person> findAddressesByPerson(String id);
@Query(“选择地址,META(sample).id作为_-id,META(sample).cas作为_-cas来自'sample',其中id=$1”)
Flux FindAddressByPerson(字符串id);
我注意到有必要将META(sample).id指定为_id
和META(sample).cas指定为_cas
属性,以避免以下错误:
org.springframework.data.couchbase.core.CouchbaseQueryExecutionException:无法为N1QL到实体的映射检索足够的元数据,是否选择了_ID和_CAS?;嵌套异常是rx.exceptions.OnErrorThrowable$OnNextValue:OnError,同时发出onNext值:com.couchbase.client.java.query.DefaultAsyncN1qlQueryRow.class
如果您想更详细地了解实现,以下是示例:
{
"id": "1",
"name": "Scooby",
"lastName": "Doo",
"address": [
{
"code": "A1",
"mainStreet": "AAA",
"secondStreet": "BBB",
"phone": "11111",
"place": "home"
},
{
"code": "A2",
"mainStreet": "CCC",
"secondStreet": "DDD",
"phone": "22222",
"place": "work"
},
{
"code": "A3",
"mainStreet": "EEE",
"secondStreet": "FFF",
"phone": "33333",
"place": "treasury"
}
],
"classType": "com.jcalvopinam.model.Person"
}
"address": [
{
"code": "A1",
"mainStreet": "AAA",
"secondStreet": "BBB",
"phone": "11111",
"place": "home"
},
{
"code": "A2",
"mainStreet": "CCC",
"secondStreet": "DDD",
"phone": "22222",
"place": "work"
},
{
"code": "A3",
"mainStreet": "EEE",
"secondStreet": "FFF",
"phone": "33333",
"place": "treasury"
}
]
Mono<Person> findById(String id);
@Query("SELECT addresses, META(sample).id as _ID, META(sample).cas as _CAS FROM `sample` WHERE id = $1")
Flux<Person> findAddressesByPerson(String id);