如何将一组值绑定到 jOOQ 批量插入

How to bind a collection of values to a jOOQ batch insert

我有一组对象,我想将其作为批次插入。 一开始我以为 "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();

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

您需要使用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();

在这里使用 reduce 会滥用 API,因为你的累加器不是关联的,你的身份不是实际身份。如果您已经在使用 jOOQ,使用 jOOL which 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();

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

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