我在 Hibernate 和 spring-boot-starter-data-jpa 中使用 JPA。我想合并/更新一組專案。如果它是一個新專案,我想堅持下去,如果它是一個已經存在的專案,我想更新它。
@PersistenceContext(unitName = "itemEntityManager")
private EntityManager em;
@Transactional
public void saveItems(Set<Item>> items) {
items.forEach(em::merge);
}
當我這樣嘗試時,每個 Item 都會創建一個新的 HQL 陳述句并且它是inperformant。所以我正在尋找一種方法來一次性保存所有專案(如果可能的話),以節省電話和時間。
我找到了這個:
EntityTransaction transaction = em.getTransaction();
transaction.begin();
items.forEach(em::merge);
transaction.commit();
但我無法使用此事務,因為我使用了@Transactional。有沒有辦法使用本機 SQL?
uj5u.com熱心網友回復:
您可以@SQLInsert為此目的使用批量插入。請參閱使用 attachDirty (saveOrUpdate) 的 Hibernate 事務和并發
uj5u.com熱心網友回復:
我創建了一個原生 SQL 陳述句:
- 我將所有專案作為 sql 格式的值串列加入
String sqlValues = String.join(",", items.stream().map(this::toSqlEntry).collect(Collectors.toSet()));
- 然后我呼叫了一個本地查詢
em.createNativeQuery("INSERT INTO config_item"
"( id, eaid, name, type, road, offs, created, deleted )"
" VALUES " sqlValues
" ON CONFLICT (id) DO UPDATE "
" SET "
"eaid=excluded.eaid,\n"
"name=excluded.name,\n"
"type=excluded.type,\n"
"road=excluded.road,\n"
"offs=excluded.offs,\n"
"created=excluded.created,\n"
"deleted=excluded.deleted;"
).executeUpdate();
這要快得多并且有效
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/324743.html
上一篇:“默認”在SpringBoot的@Column中不起作用
下一篇:終端有兩個括號內的環境
