弹簧数据 jpa 创建或更新



在我正在开发的Web服务器中,我们接收来自用户客户端的请求,然后Web服务器从另一台服务器请求一些资源并将该资源返回给客户端。从其他 Web 服务器返回结果后,我们希望将数据库与从其他 Web 服务器返回的记录同步。我想知道是否有任何方法可以在不使用选择然后更新的情况下做到这一点。

例如,我们从其他网络服务器获取Resource {id=null, uniqueField=valWontChange, field1=val, field2=val2},而在我们的数据库中我们有Resource {id=1, uniqueField=valWontChange, field1=oldVal, field2=val2}.我宁愿不做这样的事情

Resource resDb = repo.getByUniqueField(res.uniqueField);
if (resDb != null) {
res.id = resDb.id;
}
repo.save(res);

我可以使用这样的东西:

@Modifying
@Query("update Resource r set field1 = ?1, field2= ?2 where r.uniqueField=?3")
boolean updateWhereUniqueField(Object field1, Object field2, Object uniqueField);
void createOrUpdate(Resource res) {
boolean updated = updateWhereUniqueField(res.field1, res.field2, res.uniqueField);
if (!updated) {
save(res);
}
}

我认为如果资源有很多字段,这将是不可取的,我必须将所有字段分别传递给该方法。有没有更好的方法可以解决这个问题?如果没有,是否有人对上述方法有经验,他们是否知道在实体可以拥有相当多字段的情况下哪个选项会更好?

另一种选择是在现在许多数据库支持的@Query中使用合并语句。它的好处是在一次往返中处理。

对于 JPA 更新和 SQL 合并,您可以使用 SpEL 表达式,以便可以将实体用作单个参数。