簡體   English   中英

使用 Java Hibernate API 持久化實體並更新(如果已存在)

[英]Persist entity using Java Hibernate API and update if already exists

有下表和Java實體:

CREATE TABLE search_terms (
id int(100) NOT NULL AUTO_INCREMENT,
term varchar(255) NOT NULL DEFAULT '',
last_search_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
search_count int(100) NOT NULL DEFAULT '0',
user_email varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;


public class SearchTerms implements Serializable {
private Long id;
private String term;
private Timestamp lastSearchDate;
private int searchCount;
private String userEmail;

想要將給定類型的 java 對象持久化到上表中。

例子:

List<String> searchTerms = Arrays.asList("test1", "test2", "test3");
saveSearchParams(searchTerms);

如果表中存在任何這些術語,我想增加 searchCount 否則另存為新行。

需要使用 JPA.em().merge(o) 等並且沒有 sql 插入/更新查詢

在兩列上添加了以下常量,但 JPA.em().merge(o) 不斷插入新行。

@Table(name="search_terms",  uniqueConstraints= { @UniqueConstraint(columnNames = {"term", "user_email"})})
saveSearchParams() {
        searchTerms.forEach(o -> {
            SearchTerms term = new SearchTerms();
            term.setSearchCount(1);
            term.setTerm((String) o);
            term.setUserEmail(email);
            jpaApi.em().merge(term);
        });
}

在此處輸入圖片說明

任何幫助或文檔表示贊賞。

Merge 既可以更新也可以插入,但是您應該檢查對象是否存在於 DB 中以查看是否必須將計數器設置為 1 或向其添加 1,為此您必須為每個元素拋出一個查詢。

嘗試這個:

saveSearchParams() {
    searchTerms.forEach(o -> {
        //search for example by id or in any other way
        SearchTerms term = jpaApi.em().find(SearchTerms.class, o.getId());
        if (term == null){
            term = new SearchTerms();
            term.setSearchCount(1);
        }else{
            term.setSearchCount(term.getSearchCount()+1);
        }
        
        term.setTerm((String) o);
        term.setUserEmail(email);
        jpaApi.em().merge(term);
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM