Java jdbc ResultSet.get<;数据类型>;返回空值

Java jdbc ResultSet.get<;数据类型>;返回空值,java,jdbc,amazon-redshift,Java,Jdbc,Amazon Redshift,所以我有以下问题。 我有一个Java应用程序,它通过jdbc连接到红移数据库。执行一个简单的SELECT查询将生成一个不为null的结果集(我选中了) 现在,当我尝试从这个ResultSet提取数据时,该方法有时会返回null,即使以前的ResultSet.wasnull()返回false,并且在数据库中手动检查也会发现相关记录不包含该属性的null值 示例代码: private void test(){ ResultSet rs = null; ResultSetMe

所以我有以下问题。 我有一个Java应用程序,它通过jdbc连接到红移数据库。执行一个简单的SELECT查询将生成一个不为null的结果集(我选中了)

现在,当我尝试从这个ResultSet提取数据时,该方法有时会返回null,即使以前的ResultSet.wasnull()返回false,并且在数据库中手动检查也会发现相关记录不包含该属性的null值

示例代码:

    private void test(){

    ResultSet rs = null;
    ResultSetMetaData rsmd = null;
    String getTable = "SELECT * from myTable"; //
    try(PreparedStatement prep = myConnection.prepareStatement(getTable
            , ResultSet.TYPE_FORWARD_ONLY
            )){
        rs = prep.executeQuery();
        rsmd = rs.getMetaData();
        int columns = rsmd.getColumnCount();

        while(rs.next()){                               // loop over all rows
            for(int col = 1; col <= columns; col++){
                if(rs.wasNull())
                    System.out.println("NULL Value detected!");

                System.out.println("Column Name: " + rsmd.getColumnName(col));
                System.out.println("Column value: " + rs.getString(col));
            }
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }
}
private void test(){
结果集rs=null;
ResultSetMetaData rsmd=null;
String getTable=“从myTable中选择*”//
try(PreparedStatement prep=myConnection.prepareStatement(getTable
,ResultSet.TYPE_FORWARD_仅限
)){
rs=准备执行();
rsmd=rs.getMetaData();
int columns=rsmd.getColumnCount();
while(rs.next()){//在所有行上循环
对于(int col=1;col,来自以下的javadoc:

报告上次读取的列的值是否为SQL
NULL
。注意 您必须首先调用列上的一个getter方法来尝试 读取其值,然后调用方法
wasNull
,查看 读取的值为SQL
NULL

返回:
true
如果最后读取的列值是SQL
NULL
否则为false

换句话说,您应该在读取列后使用它。请注意,对于对象类型,调用
wasNull
是没有意义的,因为对象获取程序已经返回
null

此方法旨在使用基本getter(如
getInt()
)读取列时使用,因为对于
null
值,这些getter将返回
0
。然后可以使用
wasNull()
检查该值是否真的
0
或实际上
null

换句话说,将代码更改为:

while(rs.next()){                               // loop over all rows
    for(int col = 1; col <= columns; col++){
        String value = rs.getString(col);
        if(value == null)
            System.out.println("NULL Value detected!");

        System.out.println("Column Name: " + rsmd.getColumnName(col));
        System.out.println("Column value: " + value);
    }
}

谢谢,我应该更仔细地阅读Javadoc。但是,重点仍然是我手动检查了数据库中有问题的字段,在那里我还发现不存在NULL,例如,我会找到一个非常合理的日期值,其中rs.getDate()简单返回null。@Flo我建议您发布一个新问题,该问题提供了一个复制该问题的方法。如果它是红移驱动程序中的一个错误,我会感到非常惊讶。我希望使用其他数据库或表之类的东西,然后您进行检查。我确实让应用程序通过System.out.println吐出了使用过的SELECT()并使用表的完全限定名将其粘贴到sql Workbench中。我还复制粘贴了DB url,并确保使用相同的凭据。我不知道如何检查错误的DB/表。在任何情况下,对于一个简单的示例,我还需要提供一个表,其中包含导致此行为的数据,而且我没有在我看来,这似乎完全是随机的,但当我建立自己的测试表时,不知何故,我似乎无法插入导致这些“不需要的空值”的数据@Flo在任何情况下,我都无法解决您的红移特定问题。我没有这方面的经验。我只是回答了不正确使用JDBC api导致的问题。
while(rs.next()){                               // loop over all rows
    for(int col = 1; col <= columns; col++){
        String value = rs.getString(col);
        if(rs.wasNull())
            System.out.println("NULL Value detected!");

        System.out.println("Column Name: " + rsmd.getColumnName(col));
        System.out.println("Column value: " + value);
    }
}