表名为Postgres JDBC的别名

时间:2016-01-04 11:45:30

标签: mysql postgresql jdbc

我们有一个方法,它使用表名并对列进行操作。此方法之前使用的是MySQL,但是使用postgres作为表名称为空白。

我正在提供一个非常天真的SQL查询,仅用于演示。

select * from ((select * from users2 limit 1) 
union (select * from users limit 1)) as sub;

用于演示获取表名的代码。

 try{
        connection = DriverManager.getConnection(
                connectionURL, dbUserName,
                dbPassword);



        PreparedStatement psmt = connection.prepareStatement("select * from ((select * from users2 limit 1) union (select * from users limit 1)) as sub");

        ResultSet rs = psmt.executeQuery();

        ResultSetMetaData metaData = rs.getMetaData();

        System.out.println("Table Name");
        System.out.println("----------");

        System.out.println(metaData.getTableName(1));


    }

在MYSQL中,连接参数为?useOldAliasMetadataBehavior=true,它将表名打印为sub.But,在Postgres中打印出一个空字符串。

我甚至尝试了递归CTE,如下所示。

with sub as((select * from users2 limit 1) 
union (select * from users limit 1)) select * from sub;

问题

  • 如何将表名作为别名?在MYSQL中,它由一个参数控制,Postgres有什么相同的东西吗?
  • 可以更改查询中的任何内容,以便结果集元数据返回别名表名称。

请注意,我不想在这里查看视图,这只是一次性使用。我也无法修复底层方法,因为它会导致所有使用代码的代码更改。

有没有快速解决方法?

1 个答案:

答案 0 :(得分:2)

ResultSetMetaData.getTableName不应该返回表的别名,它应该返回实际的源表名(如果可用)。这也是为什么在MySQL中您需要明确使用useOldAliasMetadataBehavior=true来获取此信息的原因。

从JDBC规范的角度来看,PostgreSQL的行为更好。 union不能具有列的表名,因为结果集中单个列中的值可能来自完全不同的表。据我所知,PostgreSQL没有选项可以返回您期望的信息。