【问题标题】:Native List Insert query in Jpa/hibernate + SpringJpa/hibernate + Spring中的本机列表插入查询
【发布时间】:2016-10-26 10:33:15
【问题描述】:

我想在我的数据库中插入一个对象列表。在特殊情况下,我知道他们的主键(不是自动生成的)不存在。由于我需要插入一个大集合,save(Iterable<Obj> objects) 会很慢。

因此我考虑使用本机查询。 native insert query in hibernate + spring data

在上一个答案中,它没有说明如何插入对象集合。这可能吗?

@Query("insert into my_table (date, feature1, feature2, quantity) VALUES <I do not know what to add here>", nativeQuery = true)
void insert(List<Obj> objs);

当然,如果你有一个整体上更好的解决方案,那就更好了。

【问题讨论】:

  • 尝试实现spring-data JPA批量插入

标签: java spring hibernate jpa


【解决方案1】:

我最终实现了自己的存储库。这个性能真的不错,2s而不是35s之前插入50000个元素。这段代码的问题在于它不能阻止 sql 注入。

我还尝试使用 setParameter(1, ...) 构建查询,但不知何故 JPA 需要很长时间才能做到这一点。

class ObjectRepositoryImpl implements DemandGroupSalesOfDayCustomRepository {

    private static final int INSERT_BATCH_SIZE = 50000;

    @Autowired
    private EntityManager entityManager;

    @Override
    public void blindInsert(List<SomeObject> objects) {
         partition(objects, INSERT_BATCH_SIZE).forEach(this::insertAll);
    }

    private void insertAll(List<SomeObject> objects) {
         String values = objects.stream().map(this::renderSqlForObj).collect(joining(","));
         String insertSQL = "INSERT INTO mytable (date, feature1, feature2, quantity) VALUES ";
         entityManager.createNativeQuery(insertSQL + values).executeUpdate();
         entityManager.flush();
         entityManager.clear();
    }

    private String renderSqlForObj(Object obj) {
        return "('" + obj.getDate() + "','" +
            obj.getFeature1() + "','" +
            obj.getFeature2() + "'," +
            obj.getQuantity() + ")";
    }
}

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2022-01-05
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    相关资源
    最近更新 更多