JPQL 查询不更新数据库

JPQL Query not updating database

我有一个带有 @NamedQuery 的 JPQL,它不会 return 错误,但也不会更新数据库。

这是实体。

@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;
}
}

这是 DAO:

@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 中的调用方式...(对象中的参数已更改。调试显示它。)

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

但是...当方法 updateById 被调用时,什么也没有发生...而且我没有收到任何错误...它只是没有更新,并且 return 没有任何错误...到底发生了什么?

PS:我没有使用 Spring,只是 JPA...它快把我逼疯了!没有错误,没有更新...请帮助! =) 谢谢!

PS:我还有其他 @NamedQueries(不是更新,而是 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);
}

第一个方法参数中的对象包含我想要持久化的更改,dao 是服务中 @Inject 的对象。

扩展 class 的 AbstractDAO 有一个更新方法,它最终起作用了(但是如果我直接从服务调用 Abstract 的更新,它也不起作用。

AbstractDAO 实现了 @PersistenceContextEntityManager

我相信这是查询的 UPDATE 语句的问题,因为 SELECT 工作得很好。

嗯,就是这样! =)