У меня есть таблица, которая принимает 4 столбца в качестве первичного ключа и имеет 4 других столбца с некоторыми числовыми данными.Эти данные часто обновляются.В случае если в базе данных уже существует строка с первичным ключом, указанным в запросе INSERT
, эти 4 числовых строки необходимо обновить не путем замены старых данных, а путем добавления старого значения и нового, указанного в запросе INSERT
,Проблема в том, что я не хочу использовать какие-либо операторы PreparedStataments
или SQL, объявленные в String, как в аннотации @SQLInsert
, но я хотел бы сделать это динамически в коде, потому что таких таблиц будет гораздо большевозможны частые изменения количества столбцов, поэтому я не хочу постоянно обновлять Strings
.Поэтому мне интересно, есть ли какой-нибудь метод Hibernate или я могу создать собственный конфигурационный класс Hibernate, чтобы изменить вставки по умолчанию без написания операторов String
.Также мне нужно, чтобы запросов к базе данных было как можно меньше, в идеале только один.
Я уже пробовал:
- Использование
@SQLInsert
с INSERT ON DUPLICATE KEY UPDATE
- Выбор строки, получение числовых полей, добавление ее в коде для нового
Entity
объект и сохранение нового объекта
Оба эти метода работают, но для первого метода требуется оператор String
с оператором, а для второго требуется два запроса к базе данных, что повлияет на производительность.
Так что я хотел бы сделать то же самое, но исключительно в коде.Я предоставляю класс Entity
ниже для справки.Я использую базу данных MySQL.
@Entity
@Table(name = "fact_gdpr_data")
@SQLInsert(sql = "INSERT INTO fact_gdpr_data (LocalTimezoneAgreementAcceptCount, LocalTimezoneAgreementNoticeViewCount, UtcAgreementAcceptCount, " +
"UtcAgreementNoticeViewCount, TenantId, DeviceId, DateId, AppId) VALUES (?, ?, ?, ?, ?, ?, ?, ?) " +
"ON DUPLICATE KEY UPDATE " +
"LocalTimezoneAgreementAcceptCount = VALUES(LocalTimezoneAgreementAcceptCount) + LocalTimezoneAgreementAcceptCount, " +
"LocalTimezoneAgreementNoticeViewCount = VALUES(LocalTimezoneAgreementNoticeViewCount) + LocalTimezoneAgreementNoticeViewCount, " +
"UtcAgreementAcceptCount = VALUES(UtcAgreementAcceptCount) + UtcAgreementAcceptCount, " +
"UtcAgreementNoticeViewCount = VALUES(UtcAgreementNoticeViewCount) + UtcAgreementNoticeViewCount", check = ResultCheckStyle.COUNT)
public class FactGdprData implements Serializable {
@Column(name = "UtcAgreementAcceptCount")
private int utcAgreementAcceptCount;
@Column(name = "LocalTimezoneAgreementAcceptCount")
private int localTimezoneAgreementAcceptCount;
@Column(name = "UtcAgreementNoticeViewCount")
private int utcAgreementNoticeViewCount;
@Column(name = "LocalTimezoneAgreementNoticeViewCount")
private int localTimezoneAgreementNoticeViewCount;
@Id
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TenantId", referencedColumnName = "Id")
private DimTenant tenantId;
@Id
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "AppId", referencedColumnName = "Id")
private DimApp appId;
@Id
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DeviceId", referencedColumnName = "Id")
private DimDevice deviceId;
@Id
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DateId", referencedColumnName = "Id")
private DimDate dateId;
// Getters, Setters etc.
}