Hibernate INSERT ON DUPLICATE KEY UPDATE без @SQLInsert - PullRequest
0 голосов
/ 27 мая 2019

У меня есть таблица, которая принимает 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.
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...