在Spring Boot中将项目追加到Json数组

时间:2019-04-03 11:17:27

标签: java arrays hibernate spring-boot spring-data-jpa

我有一个这样的实体Tag

@Entity
@Table(name = "tags")
public class Tag {
    @Id
    String name;
    @ElementCollection(fetch = FetchType.EAGER)
    @Column(name = "values")
    Collection<String> values;

    public Collection<String> getValues() {
        return values;
    }

    public void setValues(Collection<String> values) {
        this.values = values;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我设计了这个实体,以便拥有这样的json

{
    "name": "rbb",
    "values": [
        "Rank Banker",
        "Tank Ranker"
    ]
}

我有一个像这样的控制器

@RequestMapping("/tags")
@RestController
public class TagController {
    @Autowired
    TagsRepository tagsRepository;
    @PostMapping("/set")
    private ResponseEntity<CustomResponse> setTags(@RequestParam(value = "tag") String tag, @RequestParam(value = "values") Set<String> values){

        Tag tag1 = new Tag();
        tag1.setName(tag);
        tag1.setValues(values);

        tagsRepository.save(tag1);
        CustomResponse customResponse = new CustomResponse();
        customResponse.setStatus("Success");
        customResponse.setMessage("Successfully saved tag");
        return new ResponseEntity<>(customResponse, HttpStatus.OK);
    }

}

在执行此操作时,每次点击此API时,我的数据都会被替换。

我想做的是将新值附加到最后一个json上,因此我是这样做的

@RequestMapping("/tags")
@RestController
public class TagController {
    @Autowired
    TagsRepository tagsRepository;
    @PostMapping("/set")
    private ResponseEntity<CustomResponse> setTags(@RequestParam(value = "tag") String tag, @RequestParam(value = "values") Set<String> values){
        Optional<Tag> tg = tagsRepository.findById(tag);
        Tag tag1;

        if(!tg.isPresent()){
            tag1 = new Tag();
            tag1.setName(tag);
            tag1.setValues(values);
        }else {
            tag1 = tg.get();
            tag1.getValues().addAll(values);
        }


        tagsRepository.save(tag1);
        CustomResponse customResponse = new CustomResponse();
        customResponse.setStatus("Success");
        customResponse.setMessage("Successfully saved tag");
        return new ResponseEntity<>(customResponse, HttpStatus.OK);
    }

}

我首先要查找该值是否已经存在,如果存在,则将其添加到数组中。但是我不认为这是正确的方法,因为当数组很大时,找到一个值变得更加乏味。因此,还有其他有效的方法可以实现这一目标。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

最直接的方法是使用现有的Tag

  Optional<Tag> tg = tagsRepository.findById(tag).orElse(()=>{
        Tag newTag=new Tag();
        newTag.setName(tag);
        newTag.setValues(new HashSet<>());
   });
   //eventually chekc for duplicates and add new values OR
   // change Collection<String> to Set<String> to get rid of the problem
  tg.getValues().addAll(values);

    tagsRepository.save(tg);