PostgreSQL无法将空字符串转换为(null)日期值

时间:2019-09-01 08:56:54

标签: java postgresql jdbc

我将使用JDBC将数据推送到PostgreSQL中。
所以我在Dao中这样写了Insert代码。

public void insert(Connection con, List<InsertVo> list) throws Exception{
    PreparedStatement pstmt = null;
    int listSize = list.size();
    int pstmtSetInt = 1;

    try {
        String sql = "insert into tableName "
                + "(colName1,colName2,colName3) " 
                + "values ";
        String addInsertSql = "(?,?,?::date)";
        sql = addInsertQuery(sql, addInsertSql, listSize);
        pstmt = con.prepareStatement(sql);
        for (InsertVo vo : list) {
            pstmt.setString(pstmtSetInt++, vo.getColName1()); 
            pstmt.setInt(pstmtSetInt++, vo.getColName2());  
            pstmt.setString(pstmtSetInt++, vo.getColName3()); 
        }
        System.out.println(pstmt);

    } catch (Exception e) {
        e.printStackTrace();
        throw e;
    } finally {
        try {
            if (pstmt != null) {
                pstmt.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

private String addInsertQuery(String sql, String addInsertSql, int listSize) {
    for (int idx = 0; idx < listSize; idx++) {
        sql = sql + addInsertSql;
        if (listSize-1 != idx) {
            sql = sql + ", ";
        }
    }
    return sql;
}

一次输入许多重复的Insert语句,因此它是在增加'()'的数量的情况下编写的。
但是,此代码的问题在于,如果日期部分包含null或诸如""之类的空字符串,则会出现错误。
由于该部分不是not null,因此可以是null""
最重要的是,我想知道是否还有其他事情,除了检查日期部分并给出不同的插入语句。

  

ERROR消息看起来像这样。
  org.postgresql.util.PSQLException: ERROR: invalid input syntax for type date: ""


  

我再次检查发现,如果我将值更改为"" NULL,则错误不会出现在其中。

//pstmt.setString(pstmtSetInt++, vo.getColName3());

String dateValue=vo.getColName3();
if (dateValue.equals("")) {
        dateValue = null;
    }
pstmt.setString(pstmtSetInt++, dateValue);
  

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

除了检查日期部分并给出不同的插入语句外,我想知道是否还有其他内容。

您无需为每种情况使用不同的SQL语句,只需调整该语句,以免在传递空字符串时该语句不会失败:

INSERT INTO tblname ( ... , col3) VALUES ( ... , NULLIF(?, '')::date)