当前位置: 首页 > 知识库问答 >
问题:

我怎么能得到与反应沙发基地的对象的嵌套列表?

公良信然
2023-03-14

我最近开始回顾/学习一些关于反应性Couchbase,我试图实现一个使用Spring数据和Spring启动技术的示例,我有以下模型:

@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
}

存储库:

@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "address")
public interface AddressRepository extends ReactiveCouchbaseRepository<Address, String> {
}

@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "person")
public interface PersonRepository extends ReactiveCouchbaseRepository<Person, String> {
}

服务:

public interface PersonService {
    Flux<Person> getAllPersons();
    Mono<Person> getPerson(String id);
    Flux<Address> getAddressesByPerson(String id);
}

@Service
public class PersonServiceImpl implements PersonService {
    @Autowired
    private PersonRepository personRepository;

    @Override
    public Flux<Person> getAllPersons() {
        return personRepository.findAll();
    }

    @Override
    public Mono<Person> getPerson(String id) {
        return personRepository.findById(id);
    }

    @Override
    public Flux<Address> getAddressesByPerson(String id) {
        return null;
    }
}

控制器:

@RestController
@RequestMapping("/sample_couchbase")
public class PersonController {
    @Autowired
    private PersonService personService;

    @GetMapping("/people")
    public Flux<Person> getAllPersons() {
        return personService.getAllPersons();
    }

    @GetMapping("/person/{id}")
    public Mono<ResponseEntity<Person>> getPersonsById(@PathVariable String id) {
        return personService.getPerson(id)
                            .map(person -> ResponseEntity.status(HttpStatus.OK).body(person))
                            .defaultIfEmpty(ResponseEntity.notFound().build());
    }
}

到目前为止,这工作得很好,我可以检索所有的人,也可以通过一个特定的人的id过滤,另一方面,我想检索一个特定的人的地址的所有列表,我的意思是我有这个文档在Couchbase:

{
  "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"
}

当我调用服务时,例如: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和Flux,而不是一个简单的对象或列表,所以我不知道如何做到这一点,有人能给我出个主意吗?还是有更好的解决方案?

共有1个答案

燕靖
2023-03-14

我找到了一种检索特定人员地址的简单方法,我使用了一个查询,其中我指定了要检索的内容:

@Query("SELECT addresses, META(sample).id as _ID, META(sample).cas as _CAS FROM `sample` WHERE id = $1")
Flux<Person> findAddressesByPerson(String id);

我注意到有必要指定META(示例)。id为_idMETA(示例)。cas as _cas属性以避免以下错误:

org。springframework。数据沙发床。果心CouchbaseQueryExecutionException:无法为N1QL到实体的映射检索足够的元数据,是否选择了_ID和_CAS?;嵌套异常是rx。例外情况。OnErrorThrowable$OnNextValue:OnError在发出onNext-value:com时。沙发床。客户JAVA查询DefaultAsyncN1qlQueryRow。类别

如果您想更详细地查看实现,以下是示例:https://github.com/juanca87/sample-couchbase-rx

 类似资料:
  • 问题内容: 我试图映射对象数组,每个数组包含另一个嵌套的对象数组。但是,该映射不适用于嵌套数组。我如何在嵌套数组的内容上进行映射,同时使所有的父对象保持相同? 小提琴: https : //jsfiddle.net/69z2wepo/249197/ 数据结构如下: 地图看起来像 问题答案: 由于每个元素都有一个数组,因此您也必须结束。 例

  • 但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?

  • 我试图在React中创建一个状态对象。我要求我们的状态实际上是一个由setState更新的字段 代码应为: 我应该如何将相同的对象设置为嵌套对象?

  • 问题内容: 我从看起来像这样的API获取JSON: 我尝试了几种方法来在c#对象中表示此JSON(太多内容无法在此处列出)。我已经尝试过使用列表和字典,这是我尝试表示它的最新示例: 这是我用来反序列化JSON的方法: 包含和。并且包含,但是是。因此,除了反序列化之外,什么都没有。 它应该很简单,但是由于某种原因我无法弄清楚正确的对象表示形式 问题答案: 要使用,即: 假设项目名称和随响应而变化,并

  • 我正在尝试映射这个JSON 我自己创建的java对象 我得到的错误是: 通用域名格式。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:无法反序列化