Gdy używam PostgreSQL, znalazłem następujący kod:Czy to prawda, że "ResultSet.getMetaData.getTableName (col)" sterownika jdbc postgresql zawsze zwraca pusty ciąg znaków?
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from t");
String tableName = rs.getMetaData().getTableName(1);
System.out.println(tableName);
Drukuje pusty ciąg.
Sprawdziłem kod źródłowy i stwierdziłem, że metoda org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData#getTableName
zawsze zwraca pusty ciąg znaków.
Kod źródłowy jest:
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 "";
}
}
Widać to po prostu zwrócić ""
.
znalazłem dyskusję na ten temat można znaleźć na stronie: http://archives.postgresql.org/pgsql-jdbc/2009-12/msg00100.php
uważają „rs.getMetaData.getTableName (COL)” powinien zwrócić alias w zapytanie nie podstawowa nazwa tabeli. Ale trudno to wdrożyć, więc lepiej zostawić to puste.
także dali sposób, aby uzyskać nazwę tabeli, należy:
PGResultSetMetaData.getBaseTableName()
Próbka:
ResultSet rs = stmt.executeQuery("select * from x");
// convert it to PGResultSetMetaData
PGResultSetMetaData meta = (PGResultSetMetaData)rs.getMetaData();
String tableName = meta.getBaseTableName(1);
Teraz można drukować poprawną nazwę tabeli.
Nie wiem, czy implementacja PostgreSQL jest poprawna, ale zwrócenie podstawowej nazwy tabeli jest o wiele bardziej przydatne niż pusty ciąg, a większość innych baz danych udostępnia nazwę tabeli zamiast pustego ciągu.
Mam problem z wykorzystaniem ram anorm play2 z postgesql: Play2's anorm can't work on postgresql, ale to działa dobrze na innych bazach danych.
Jak myślisz, jaka jest prawidłowa implementacja sterownika jdbc postgresql? Zwrócić pusty ciąg, nazwę tabeli podstawowej lub coś innego?