Когда я использую 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 правильная, но возвращение имени базовой таблицы гораздо полезнее, чем пустая строка, и большинство других баз данных предоставляют имя базовой таблицы вместо пустой строки.
У меня проблема с использованием структуры anorm play2 с postgesql: Anorm Play2 не может работать с postgresql , но это хорошо работает с другими базами данных.
Как вы думаете, правильная реализация драйвера jdbc postgresql? Вернуть пустую строку, имя базовой таблицы или что-то еще?