Когда я использую postgresql, я нашел следующий код:
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from t");
String tableName = rs.getMetaData().getTableName(1);
System.out.println(tableName);
Он печатает пустую строку.
Поэтому я проверил исходный код и обнаружил, что метод org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData#getTableName
всегда возвращает пустую строку.
Исходный код:
public abstract class AbstractJdbc2ResultSetMetaData implements PGResultSetMetaData {
/*
* @param column the first column is 1, the second is 2...
* @return column name, or "" if not applicable
* @exception SQLException if a database access error occurs
*/
public String getTableName(int column) throws SQLException
{
return "";
}
}
Вы можете видеть, что он просто возвращает ""
.
Я нашел обсуждение по этому поводу, см.: http://archives.postgresql.org/pgsql-jdbc/2009-12/msg00100.php
Они думают, что "rs.getMetaData.getTableName(col)" должен возвращать псевдоним в запросе, а не имя базовой таблицы. Но что сложно реализовать, поэтому лучше оставить его пустым.
Также они дали метод для получения имени таблицы, используйте:
PGResultSetMetaData.getBaseTableName()
Образец:
ResultSet rs = stmt.executeQuery("select * from x");
// convert it to PGResultSetMetaData
PGResultSetMetaData meta = (PGResultSetMetaData)rs.getMetaData();
String tableName = meta.getBaseTableName(1);
Теперь он может печатать правильное имя таблицы.
Я не знаю, что реализация postgresql верна, но возврат имени базовой таблицы гораздо полезнее, чем пустая строка, и большинство других баз данных предоставляют имя базовой таблицы вместо пустой строки.
У меня проблема с использованием анорм-фреймворка play2 с postgesql: анорм Play2 не может работать на postgresql, но это хорошо работает и с другими базами данных.
Как вы думаете, правильная реализация драйвера jdbc postgresql? Вернуть пустую строку, имя базовой таблицы или что-то еще?