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

时间:2012-05-13 05:07:52

标签: 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日正在返回,因为时间值超出了对日期对象有效的范围)。

我很困惑因为如果我覆盖DefaultTableModel中的getColumnClass方法总是返回String.class并使用表方法setAutoCreateRowSorter(true),当我单击包含java.sql.Time对象的列的标题进行排序时它抛出java.lang.ClassCastException,它表示java.sql.time不能被转换为String。为什么这会正确地将数据标识为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
                }
            }
        };

1 个答案:

答案 0 :(得分:3)

ClassCastException即将发生,因为您正在尝试将Time类强制转换为String。它显示为Date对象,因为java.sql.Time和java.sql.Date都是java.util.Date的子类。这些子类只是瘦包装器(同样的东西只有足够的额外信息可以映射到SQL列)。所以在Swing JTable中它被用作java.util.Date,因为java.sql类型与swing组件大部分无关。