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