ResultSetMetaData.getColumnTypeName 返回 UNKNOWN

Posted

技术标签:

【中文标题】ResultSetMetaData.getColumnTypeName 返回 UNKNOWN【英文标题】:ResultSetMetaData.getColumnTypeName returns UNKNOWN 【发布时间】:2016-10-25 07:28:38 【问题描述】:

我有一个查询,其 getColumnTypeName 返回为 UNKNOWN 但是当 getColumnType 被调用时,它返回有效结果 92 TIME

我已经从here验证了它

            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Connecting to database...");
            con= DriverManager.getConnection("jdbc:mysql://localhost/test","root","1234");
            System.out.println("Creating statement...");
            stmt = con.createStatement();
            rs = stmt.executeQuery("select case when id>0 then last_day(date) else makedate(2015,1) end as date from emp.tabDate");
            ResultSetMetaData rsmd=rs.getMetaData();
            System.out.println(rsmd.getColumnTypeName(1));//returns UNKNOWN
            System.out.println(rsmd.getColumnType(1));//returns 92

有没有办法获得有效的列类型

【问题讨论】:

【参考方案1】:

根据关于 java.sql.Types 常量的 Java 文档,值 92 代表 java.sql.TIME

您的 sql 语句包含表达式,并且派生结果必须是 92 类型,即 java.sql.TIME。如果正确,则尝试CAST将表达式结果为TIME并查看结果。

CAST 示例

select cast(
       case when id>0 
                 then last_day(date) 
                 else makedate(2015,1) 
        end as time ) as expr_res 
  from emp.tabDate

还可以查看getColumnTypeName(int) 上的文档。它说,

如果列类型是用户定义类型,则为完全限定类型 返回名称。

【讨论】:

【参考方案2】:

如果getColumnType(int column) 返回Types.DATE (91),则表示您应该调用getDate()

命名约定并不难理解。如果getColumnType 返回Types.XXXXX,则表示您应该调用getXxxxx()

够简单吧?

【讨论】:

抱歉,我没听懂你的意思。有效的 JDBC 列类型是 DATE

以上是关于ResultSetMetaData.getColumnTypeName 返回 UNKNOWN的主要内容,如果未能解决你的问题,请参考以下文章