DELETE语句在SQLYog中可以执行,但在Java中却无法执行
@Override
public String getDeleteQuery() {
return "DELETE FROM prod_evidencija WHERE idProdavac = ? AND idProdavnica = ? AND datum = ?";
}
@Override
public void fillDeleteStatement(PreparedStatement ps) throws SQLException {
ps.setInt(1, prodavac.getIdProdavac());
ps.setInt(2, prodavnica.getIdProdavnica());
ps.setDate(3, java.sql.Date.valueOf(datum));
// ps.setObject(3, datum);
System.out.println(datum); //2022-07-24
}
这是我针对prod_evidencija类型对象的删除查询。该对象具有由外键idProdavac和 idProdavnica组成的复合主键,以及它自己的LocalDate字段datum。(这三列是数据库表中唯一的列。datum列在数据库中的类型是date。)prod_evidencija是 prodavac与 prodavnica对象之间的关联类。
public <T extends DomainObject<T>> Object delete(T obj) throws SQLException {
try (PreparedStatement ps = Konekcija.getInstance().getKonekcija()
.prepareStatement(obj.getDeleteQuery())) {
obj.fillDeleteStatement(ps);
System.out.println(ps);
int affectedRows = ps.executeUpdate();
System.out.println(affectedRows);
return affectedRows > 0;
}
}
这是数据库代理方法,应该用来删除一个对象,并且对其他类型的对象也能正常工作(如果这点有关系,因为它们没有日期类型的字段)。在这种情况下,它会打印出一个填充正确的语句: com.mysql.cj.jdbc.ClientPreparedStatement: DELETE FROM prod_evidencija WHERE idProdavac = 1 AND idProdavnica = 2 AND datum = '2026-05-11' 当在SQLyog中手动执行该查询时,能够正常工作。然而,在我的Java应用程序中,执行完后却没有任何反应,返回的受影响行数为0,我也不知道原因。我以为可能和日期有关,于是尝试使用setObject,并试验格式化器,但都无济于事。
更新查询,即改变一组id的日期,工作正常。插入也一样。
没有异常或错误(除了我所打印的信息),仿佛在执行更新时直接凭空消失。向fillDeleteStatement() 中添加对ids和日期的打印后,打印的信息也正确且与数据库中的数据相符。如有需要,我可以提供其他查询、代码及信息。
解决方案
找到了问题。填入语句中的日期实际上比我转发的日期早一天。我在数据库连接字符串中加入了正确的时区设置,问题就再也没有出现。感谢Abra和匿名用户的时间。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。