Когда isSearchable возвращает false для столбца JDBC Oracle? - PullRequest
1 голос
/ 01 июня 2010

В каких случаях вызов java.sql.ResultSetMetaData.isSearchable(int col) вернет false для базы данных Oracle? Документация для метода на самом деле не отвечает на вопрос:

"Indicates whether the designated column can be used in a where clause."

Я могу вспомнить только один случай - когда столбец является результатом агрегатной функции (в этом случае он должен быть частью фильтра HAVING, а не фильтра WHERE).

Есть ли другие случаи?

1 Ответ

1 голос
/ 04 июня 2010

Это больше связано с типом значения столбца, а не с тем, как выбран столбец. Эта информация хранится в DatabaseMetaData#getTypeInfo(). Столбец SEARCHABLE может возвращать либо DatabaseMetaData.typePredNone (без возможности поиска), либо другие значения.

9: ПОИСК short => вы можете использовать "WHERE" в зависимости от типа:

  • typePredNone - без поддержки
  • typePredChar - поддерживается только с WHERE .. LIKE
  • typePredBasic - Поддерживается, кроме WHERE .. LIKE
  • typeSearchable - поддерживается для всех WHERE ..

Вот фрагмент, который отображает эту информацию:

DatabaseMetaData databaseMetaData = connection.getMetaData();
ResultSet typeInfo = databaseMetaData.getTypeInfo();
System.out.println("type name                      | data type | searchable");
System.out.println("-------------------------------+-----------+------------");
while (typeInfo.next()) {
    String typeName = typeInfo.getString("TYPE_NAME");
    int dataType = typeInfo.getInt("DATA_TYPE");
    boolean searchable = typeInfo.getShort("SEARCHABLE") != DatabaseMetaData.typePredNone;
    System.out.printf("%-30s | %-9d | %-9s%n", typeName , dataType, searchable);
}

При подключении к PostgreSQL 8.4 это выглядит примерно так:

type name                      | data type | searchable
-------------------------------+-----------+------------
bool                           | -7        | true     
bytea                          | -2        | true     
char                           | 1         | true     
name                           | 12        | true     
int8                           | -5        | true     
bigserial                      | -5        | true     
int2                           | 5         | true     
int2vector                     | 1111      | true     
int4                           | 4         | true     
serial                         | 4         | true     
regproc                        | 1111      | true     
text                           | 12        | true     
(*snip*, it were about 270 rows, all TRUE by the way)

data type корректируется с ResultSetMetaData#getColumnType().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...