Spring Data JPA检查记录是否存在并更新else插入



如果使用一个参数的Spring JPA查询给定案例的记录已经存在,我如何检查DB。如果它存在,它会进行更新,或者作为新记录插入。我尝试了一个简单的实现,但最终出现了一个500服务器错误,没有记录其他错误。

已解决[java.lang.NullPointerException]已完成500INTERNAL_SERVER_ERROR

这是我迄今为止所尝试的我的控制器

@RequestMapping(path="/updatedm",method = RequestMethod.POST)
public Boolean updateDMStatus(@RequestParam("country") String country,
@RequestParam("Id") String pId,
@RequestParam("case") String case,
@RequestParam("status") String status,
@RequestParam("updatedBy") String updatedBy){
Boolean createDm = eaDataStoreService.updateDM(country,Id,case,status,updatedBy);
return createDm;
}

我的存储库

public interface DMValidatedRepository extends CrudRepository<DMValidated, String> {
DMValidated findByCase(@Param("case") String case);
}

我的服务

public boolean updateDM(String country, String Id, String case, String status,String updatedBy) {
DMValidated document = dmValidated.findByCase(case);
if(document != null){
document.setStatus(status);
document.setUpdatedBy(updatedBy);
dmValidated.save(document);
}else{
document.getId();
document.getCase();
document.getCountry();
document.getStatus();
document.getUpdatedBy();
dmValidated.save(document);
}

return true;
}

我的型号

@Data
@ToString
@Entity
@Table(name = "DMStatus")
public class DMValidated{
@Id
@GeneratedValue
private String id;
@Column(name = "country")
private String country;
@Column(name = "Id")
private String Id;
@Column(name = "Case")
private String case;
@Column(name = "status")
private String status;
@Column(name = "updatedBy")
private String updatedBy;
public  DMValidated( String country, String Id,
String case, String status, String updatedBy){
this.country = country;
this.Id=Id;
this.case = case;
this.status =status;
this.updatedBy = updatedBy;
}

我不确定这是否是正确的方法,我尝试过研究,但没有找到具体的结果。我怎样才能做到这一点?

当对象是新的并且需要插入时,您不难忘记正确创建对象的代码

if(document != null){
document.setStatus(status);
document.setUpdatedBy(updatedBy);
}else{
document = new DMValidated();
document.setId(Id);
document.setCase(case);
document.setCountry(country);
document.setStatus(status);
document.setUpdatedBy(updatedBy);
}
dmValidated.save(document);

之前在您的代码中发生的错误是以下

}else{
document.getId();
...
}

在其他情况下,您只在document == null时得到,所以当您调用document.getId()时,会抛出一个空指针异常,然后发生500错误。

else{
document.getId();
document.getCase();
document.getCountry();
document.getStatus();
document.getUpdatedBy();
dmValidated.save(document);
}

大写文档对象初始化,但属性数据类型字符串始终为null这就是为什么每次document.getId((为null或要获取的其他属性为null指针的原因。

正确的代码

else{
document = new DMValidated();
document.setId(Id);
document.setCase(case);
document.setCountry(country);
document.setStatus(status);
document.setUpdatedBy(updatedBy);
}

您尝试执行的此操作通俗地称为UPSERT,纯粹使用JPA和Hibernate实现这一操作有点困难。我过去的做法是使用jOOQ

也就是说,StackOverflow中有很好的资源,如果你搜索这些关键词,可以帮助你更快地找到答案。

无论如何,这里有一些你可能想先复习的读数:

  • https://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/insert-statement/insert-on-duplicate-key/
  • https://www.depesz.com/2012/06/10/why-is-upsert-so-complicated/
  • https://vladmihalcea.com/jooq-facts-from-jpa-annotations-to-jooq-table-mappings/
  • PostgreSQL中使用jOOQ的UPSERT

阅读Vlad Mihalcea的任何内容都会让您深入了解这个主题,以及JPA和Hibernate。

最新更新