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