Spring 数据按等号插入

Spring Data upsert by equals

我想 update/insert 一个实体,不依赖于主键而是依赖于等值:

@Entity
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Builder
class Alert {
    @Id
    @Basic(optional = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

    @Column(name = "field1")
    @EqualsAndHashCode.Include
    private String field1;

    @Column(name = "field2")
    @EqualsAndHashCode.Include
    private String field2;

    @Column(name = "field3")
    @EqualsAndHashCode.Include
    private String field3;

    @Column(name = "last_occurrence")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastOccurrence;
}

Alert alert = Alert.builder().field1("foo").field2("bar").lastOccurence(new Date()).build();

如果 equals 警报存在(例如,field1="foo"、field2="bar" 和 field3=null),我想更新它的 lastOccurence,否则插入新警报。

(当然,我可以使用像 findByField1AndField2AndField3 这样讨厌的派生查询方法...)

如果您使用 spring,则可以利用 Example。假设您有一个实现了 JpaRepositoryAlertReporitory,那么您可以执行以下操作:

Alert alert = Alert.builder().field1("foo").field2("bar").lastOccurence(new Date()).build();
Optional<Alert> dbAlert = alertRepository.findOne(Example.of(alert));
if (dbAlert.isPresent()) {
    // update
} else {
    // insert
}