protected Multimap<Id, Revision> doPublish() { Map<Revision, Id> uncommittedRevisions = getUnpublishedRevisionsForUpdate(); long lastOrdinal = getMaxOrdinal(); log.debug("publish({})", uncommittedRevisions.size()); if (uncommittedRevisions.isEmpty()) { return ImmutableMultimap.of(); } Multimap<Id, Revision> publishedDocs = ArrayListMultimap.create(); SQLUpdateClause versionUpdateBatch = options.queryFactory.update(options.version); for (Map.Entry<Revision, Id> entry : uncommittedRevisions.entrySet()) { Revision revision = entry.getKey(); Id docId = entry.getValue(); publishedDocs.put(docId, revision); setOrdinal(versionUpdateBatch, ++lastOrdinal) .where(options.version.revision.eq(revision)) .addBatch(); } versionUpdateBatch.execute(); afterPublish(publishedDocs); return publishedDocs; }
/** * 根据ID更新实体列表,实体类必须设置ID,不设置ID将跳过 * * @param entityList 实体列表 * @return 变动条数 */ default long update(@Nonnull Collection<T> entityList) { SQLUpdateClause update = sql().update(root()); for (T entity : entityList) { Long id = entity.getId(); if (null != id) { beforeUpdate(entity); validRegular(entity); update.populate(entity.setId(null)).where(pk().eq(id)).addBatch(); } } if (!update.isEmpty()) { return update.execute(); } else { update.clear(); return 0; } } }
@Test public void updateBatchFailed() { execute(insert(survey).columns(survey.name, survey.name2) .values("New Survey", "New Survey")); Exception result = null; try { execute(update(survey) .set(survey.id, 1).addBatch() .set(survey.id, 2).addBatch()); } catch (QueryException e) { result = e; } assertNotNull(result); inspectExceptionResult(result); }
@Test @ExcludeIn(TERADATA) public void update_with_templateExpression_in_batch() { assertEquals(1, update(survey) .set(survey.id, 3) .set(survey.name, Expressions.stringTemplate("'Hello'")) .addBatch() .execute()); }
@Test public void clear() { QEmployee emp1 = new QEmployee("emp1"); SQLUpdateClause update = new SQLUpdateClause(null, SQLTemplates.DEFAULT, emp1); update.set(emp1.id, 1); update.addBatch(); assertEquals(1, update.getBatchCount()); update.clear(); assertEquals(0, update.getBatchCount()); }
@Test public void batch_templates() throws SQLException { assertEquals(1, insert(survey).values(2, "A","B").execute()); assertEquals(1, insert(survey).values(3, "B","C").execute()); SQLUpdateClause update = update(survey); update.set(survey.name, "AA").where(survey.name.eq(Expressions.stringTemplate("'A'"))).addBatch(); update.set(survey.name, "BB").where(survey.name.eq(Expressions.stringTemplate("'B'"))).addBatch(); assertEquals(2, update.execute()); }
@Test public void batch() throws SQLException { assertEquals(1, insert(survey).values(2, "A","B").execute()); assertEquals(1, insert(survey).values(3, "B","C").execute()); SQLUpdateClause update = update(survey); update.set(survey.name, "AA").where(survey.name.eq("A")).addBatch(); assertEquals(1, update.getBatchCount()); update.set(survey.name, "BB").where(survey.name.eq("B")).addBatch(); assertEquals(2, update.getBatchCount()); assertEquals(2, update.execute()); }