【问题标题】:ResultSetMetaData.getColumnTypeName returns UNKNOWNResultSetMetaData.getColumnTypeName 返回 UNKNOWN
【发布时间】:2023-03-18 04:00:01
【问题描述】:

我有一个查询,其 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

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

【问题讨论】:

    标签: java mysql jdbc resultset


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      相关资源
      最近更新 更多