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的主要内容,如果未能解决你的问题,请参考以下文章