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
。假设您有一个实现了 JpaRepository
的 AlertReporitory
,那么您可以执行以下操作:
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
}
我想 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
。假设您有一个实现了 JpaRepository
的 AlertReporitory
,那么您可以执行以下操作:
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
}