【问题标题】:How to bind a collection of values to a jOOQ batch insert如何将值集合绑定到 jOOQ 批量插入
【发布时间】:2015-12-29 13:56:20
【问题描述】:

我有一组对象,我很想将它们作为批次插入。 一开始我想到的是“for-loops”,但后来我意识到这应该可以用流来实现。

BatchBindStep userLoginBatch = create
    .batch(
            create.insertInto(USERLOGIN, USERLOGIN.USERNAME, USERLOGIN.IP, USERLOGIN.MAC, USERLOGIN.LOGIN, USERLOGIN.STATUS, USERLOGIN.APPLICATION, USERLOGIN.ENTERTAINMENT_CREDENTIALS_ID, USERLOGIN.VERSION)
                    .values(null, null, null, (Timestamp) null, null, null, (Integer) null, null)
    );

userLoginsToPersist
  .stream()
  .map(login ->
        Arrays.asList(login.getUsername(), login.getIp(), login.getMac(), login.getLogin(), login.getStatus(), login.getApplication(), login.getEntertainmentCredentialsId(), login.getVersion())
  ).reduce(userLoginBatch, (a, b) -> a.bind(b));
userLoginBatch.execute();

这是我目前拥有的,它抱怨我无法减少那个对象......

【问题讨论】:

  • 我从未使用过 jOOQ,但从您的源代码中猜测,也许您可​​以将 reduce 调用替换为 forEach(b -> userLoginBatch.bind(b));

标签: java java-8 jooq


【解决方案1】:

你需要使用reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner):

userLoginsToPersist
  .stream()
  .map(login ->
        Arrays.asList(login.getUsername(), login.getIp(), login.getMac(), login.getLogin(), login.getStatus(), login.getApplication(), login.getEntertainmentCredentialsId(), login.getVersion())
  ).reduce(userLoginBatch, (b, v) -> b.bind(v), (b1, b2) -> b1)
  .execute();

【讨论】:

  • 您能否详细说明为什么需要组合器,因为它实际上并没有做任何事情? :P 否则,感谢您的帮助,它可以工作:)
  • 似乎同时 Api 发生了变化。 .reduce(userLoginBatch, (b, v) -> b.bind(v.toArray()), (b1, b2) -> b1) 为我工作。
【解决方案2】:

在此处使用 reduce 会滥用 API,因为您的累加器不是关联的,并且您的身份不是实际身份。如果您已经在使用 jOOQ,那么使用jOOL 似乎很自然,foldLeft 方法更适合这里:

Seq.seq(userLoginsToPersist)
   .map(login ->
     Arrays.asList(login.getUsername(), login.getIp(), login.getMac(),
                  login.getLogin(), login.getStatus(), login.getApplication(),
                  login.getEntertainmentCredentialsId(), login.getVersion()))
   .foldLeft(userLoginBatch, (a, b) -> a.bind(b))
   .execute();

【讨论】:

    【解决方案3】:

    如果使用forEach方法,代码会简单很多:

    userLoginsToPersist.forEach(login ->
        userLoginBatch.bind(login.getUsername(), login.getIp(), login.getMac(), login.getLogin(), login.getStatus(), login.getApplication(), login.getEntertainmentCredentialsId(), login.getVersion()));
    userLoginBatch.execute();
    

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 2018-08-13
      • 2021-03-27
      • 2020-05-22
      • 2017-12-29
      • 2021-05-23
      • 2020-03-18
      • 2012-04-28
      • 1970-01-01
      相关资源
      最近更新 更多