簡體   English   中英

JPQL 查詢不更新數據庫

[英]JPQL Query not updating database

我有一個帶有@NamedQuery的 JPQL,它不返回錯誤,但也不更新數據庫。

這是實體。

@Entity
@Table(name = "restricao_decomp")
@NamedQueries({
@NamedQuery(name = RestricaoDecomp.UPDATE_BY_ID, query = "UPDATE RestricaoDecomp a SET a.nome = ?1, "
        + "a.comentar = ?2, a.revisada = ?3 where id = ?4"),
})
public class RestricaoDecomp {

public static final String UPDATE_BY_ID = "RestricaoDecomp.updateById";

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;

@Column(name = "nome")
String nome;

@Column(name = "comentar")
String comentar;

@Column(name = "data")
LocalDate data;

@Column(name = "revisada")
Integer revisada;

public int getId() {
    return id;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getComentar() {
    return comentar;
}

public void setComentar(String comentar) {
    this.comentar = comentar;
}

public LocalDate getData() {
    return data;
}

public void setData(LocalDate data) {
    this.data = data;
}

public Integer getRevisada() {
    return revisada;
}

public void setRevisada(Integer revisada) {
    this.revisada = revisada;
}
}

這是道:

@Stateless
public class RestricaoDecompDAO extends AbstractDAO<RestricaoDecomp, Integer> {

private static final long serialVersionUID = -5926717750595575580L;

public void updateById(String nome, String comentar, Integer revisada, Integer id) {
    executeNamedQuery(RestricaoDecomp.UPDATE_BY_ID, nome, comentar, revisada, id);
}
}

這就是它在Service中的調用方式......(參數在 object 中更改。調試顯示它。)

restricaoDecompDAO.updateById(restricao.getNome(), restricao.getComentar(), 1, restricao.getId());

但是...當調用updateById方法時,什么也沒有發生...而且我沒有收到任何錯誤...它只是不更新,也不返回任何錯誤...到底發生了什么?

PS:我沒有使用 Spring,只是 JPA...這讓我發瘋,沒有錯誤。 沒有更新...請幫助! =)謝謝!

PS:我還有其他@NamedQueries (不是UPDATE,而是SELECT),效果很好....

我建議這樣做:

@Stateless
public class RestricaoDecompDAO extends AbstractDAO<RestricaoDecomp, Integer> {
    @PersistenceContext
    private EntityManager em;

    public void updateById(String nome, String comentar, Integer revisada, Integer id) {
        if(id == null) return;          
        var o = em.find(RestricaoDecomp.class, id);
        if(o == null) return;
        o.setNome(nome);
        o.setComentar(comentar);
        o.setRevisada(revisada);
    }
}

我設法讓它工作。 這就是我所做的:

public void update(RestricaoDecomp rd, RestricaoDecompDAO dao) {
    if (rd == null)
        return;
    
    RestricaoDecomp rdDB = dao.findById(rd.getId());
    
    if (rdDB == null)
        return;
    
    rdDB.setComentar(rd.getComentar());
    rdDB.setRevisada(1);
    rdDB.setNome(rd.getNome());
    
    dao.update(rdDB);
}

第一個方法參數中的 Object 包含我想要保留的更改,dao 是一個 object,它是服務中的@Inject

擴展 class 的AbstractDAO有一個更新方法,它最終起作用了(但如果我直接從服務調用 Abstract 的更新,它也不起作用。

AbstractDAO 實現了@PersistenceContextEntityManager

我相信不知何故這是查詢的 UPDATE 語句的問題,因為 SELECT 工作得很好。

嗯,就是這樣! =)

暫無
暫無

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

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