DELETE语句在SQLYog中可以执行,但在Java中却无法执行

后端开发 2026-07-09
 @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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章