Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.Time对象与java.sql.Date对象混淆_Java_Mysql_Date_Jdbc_Time - Fatal编程技术网

java.sql.Time对象与java.sql.Date对象混淆

java.sql.Time对象与java.sql.Date对象混淆,java,mysql,date,jdbc,time,Java,Mysql,Date,Jdbc,Time,我正在查询一个MySQL表,并选择varchar、Date、Time、Double和Boolean数据类型。我从ResultSet中获取数据并将其放入DefaultTableModel中,然后将其放入JTable中,然后放入用于显示的JScrollPane中 除了包含java.sql.Time对象的列之外,所有数据都正确显示。这些将显示为日期对象,它们的值均为1970年1月1日 似乎java.sql.Time对象被读取为java.sql.Date对象(我猜返回的是1970年1月1日,因为时间值超

我正在查询一个MySQL表,并选择varchar、Date、Time、Double和Boolean数据类型。我从ResultSet中获取数据并将其放入DefaultTableModel中,然后将其放入JTable中,然后放入用于显示的JScrollPane中

除了包含java.sql.Time对象的列之外,所有数据都正确显示。这些将显示为日期对象,它们的值均为1970年1月1日

似乎java.sql.Time对象被读取为java.sql.Date对象(我猜返回的是1970年1月1日,因为时间值超出了对日期对象有效的范围)

我很困惑,因为如果我重写DefaultTableModel中的getColumnClass方法以始终返回String.class并使用表方法setAutoCreateRowSorter(true),当我单击包含java.sql.Time对象的列的标题对其进行排序时,会抛出一个java.lang.ClassCastException,它说java.sql.time不能转换为字符串。为什么这会正确地将数据标识为java.sql.Time,但如果我重写DefaultTableModel getColumnClass以返回正确的类,它会将其视为日期而不是时间?如果您能帮助解决这个问题,我们将不胜感激。以下是我在DefaultTableModel中重写getColumnClass方法的方式:

        model = new DefaultTableModel() {
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                if (columnIndex == numberOfColumns) {
                    return Boolean.class;
                } else {
                    return getValueAt(1, columnIndex).getClass(); //return actual class
                    return String.class; //return string regardless of what class is
                }
            }
        };
model=newdefaulttablemodel(){
@凌驾
公共类getColumnClass(int columnIndex){
如果(columnIndex==numberOfColumns){
返回Boolean.class;
}否则{
返回getValueAt(1,columnIndex).getClass();//返回实际类
return String.class;//返回字符串,不管是什么类
}
}
};

ClassCastException即将出现,因为您正试图将Time类转换为字符串。它显示为日期对象,因为java.sql.Time和java.sql.Date都是java.util.Date的子类。这些子类只是简单的包装(同样的事情,有足够的额外信息映射到SQL列)。因此,在Swing JTable中,它被用作java.util.Date,因为java.sql类型在很大程度上与Swing组件无关。

有帮助吗?您正在将
java.sql.Time
时间戳解析为
字符串
。这是糟糕的形式。链接让我对正在发生的事情有了更好的了解。JTable将java.sql.time和java.sql.date对象都视为java.util.date的子类,因此都显示为日期,而不是日期显示为日期,时间显示为时间。关于如何正确显示java.sql.time对象有什么想法吗?同样,手工操作是不正确的。您的MySQL JDBC驱动程序应该隐藏关于时间戳的所有细节,并且应该只返回时间戳。如链接中所述,使用
ResultSet#getTimestamp()
我实际上并没有试图将时间类转换为字符串。我这样做只是为了说明,如果我将时间对象转换为字符串,那么ClassCastException会正确地将其标识为java.sql.Time对象,但是如果我没有错误地转换,JTable会将时间对象错误地转换为日期对象。有什么建议吗?就像我说的时间是日期的一个子类。所以JTable正在处理日期对象,并且看不到日期和时间之间的任何差异。你说绕开这件事到底是什么意思??你是在问如何显示时间还是什么?是的,我想知道如何显示时间。请不要告诉我不要重写getColumnClass。我需要为我在JTable中进行的一些自定义渲染手动指定一列的类。如果我不重写DefaultTableModel中的getColumnClass方法,时间将正确显示。但是,如果我重写上面的方法以返回getValueAt(row,column).getClass(),那么包含java.sql.time的列将显示1970年1月1日,而包含java.sql.Timestamp的列只显示对象的日期部分。如果要重写日期显示方式的默认行为,可以使用CustomRenderer。或者,您可以仅使用时间格式化日期,并将其显示为字符串。不管哪个对你有用,伙计。如果这也不起作用,请告诉我!