首页 > 解决方案 > Hibernate / Spring Data插入没有选择+如果不存在复合键则插入

问题描述

我在 Spring Data JPA 2.5.5 / Hibernate 5.4.32 / PostgreSQL 12.7.0 下。

我有一个数据库表“A”,主要有两个用例:

  1. 将大量数据(日期时间方面的新数据)添加到“A”中(每分钟至少 100 万条)
  2. 填充旧数据的空白间隔(就日期时间而言是旧的),同样每分钟可能有 100 万条记录:这意味着如果不存在则插入,输入数据中已经存在数据

我有以下架构:

@Embeddable
public class TableId implements Serializable {

    @Column(name = "datetime", nullable = false)
    private OffsetDateTime datetime;

    @Column(name = "data")
    private String data;

   (getters/setters...)
}

@Entity
@Table(name = "\"A\"")
public class AEntity implements Persistable<TableId> {

    @EmbeddedId
    private TableId id;

    @Column(name = "value")
    private Double value;

    @Override
    public boolean isNew() {
        return true;
    }

    (getters/setters...)
}

isNew()方法允许修复第一种情况,这意味着在插入时不进行任何选择。这是最好的方法吗?

现在对于第二点,我不知道在性能方面最好的方法是什么,有什么建议吗?

我发现了这一点,但正如预期的那样慢:

@Query(nativeQuery = true, value = "select * from A a where CONCAT(cast(a.datetime as VARCHAR), '-', a.data) in (:columns)")
List<AEntity> findByIdIn(@Param("columns") List<String> columns);

请注意,我不能在数据库中添加额外的列,并且该表包含数十亿条记录。

标签: postgresqlhibernatespring-data-jpa

解决方案


推荐阅读