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 实现了 @PersistenceContext
和 EntityManager
我相信这是查询的 UPDATE 语句的问题,因为 SELECT 工作得很好。
嗯,就是这样! =)
我有一个带有 @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 实现了 @PersistenceContext
和 EntityManager
我相信这是查询的 UPDATE 语句的问题,因为 SELECT 工作得很好。
嗯,就是这样! =)