Почему у меня ORA-00904, даже если колонка присутствует? - PullRequest
24 голосов
/ 20 апреля 2011

Я вижу ошибку при выполнении SQL-запроса hibernate.

java.sql.SQLException: ORA-00904: "table_name". "Column_name": неверный идентификатор

Когда я открываю таблицу в sqldeveloper, столбец присутствует.

Ошибка происходит только в PROD, а не в DEV.

Что я должен проверить?

Ответы [ 9 ]

23 голосов
/ 20 апреля 2011

Это может быть проблема с учетом регистра.Обычно таблицы и столбцы не чувствительны к регистру, но они будут, если вы используете кавычки.Например:

create table bad_design("goodLuckSelectingThisColumn" number);
7 голосов
/ 20 апреля 2011

Oracle выдаст ORA-00904, если исполняющий пользователь не имеет надлежащих разрешений для объектов, участвующих в запросе.

6 голосов
/ 04 ноября 2016

Это случилось со мной, когда я случайно определил две сущности с одной и той же постоянной таблицей базы данных.В одной из таблиц этот столбец существовал, в другой - нет.При попытке сохранить объект (типа ссылающийся на неверную базовую таблицу базы данных) произошла эта ошибка.

4 голосов
/ 03 марта 2014

Введите имя столбца между двойными кавычками, как в "columnName".

Если в сообщении об ошибке указан регистр символов, отличный от того, что вы написали, очень вероятно, что ваш sql-клиент выполнил автоматическое преобразование регистра для вас. Используйте двойную кавычку, чтобы обойти это. (Это работает на Squirrell Client 3.0).

3 голосов
/ 11 июля 2017

Это потому, что одна из БД, с которой был создан столбец ", делает его имя чувствительным к регистру.

Имя столбца таблицы Oracle: GoodRec Улей не может распознать чувствительность к регистру: брошена ОШИБКА - Вызвано: java.sql.SQLSyntaxErrorException: ORA-00904: «GOODREC»: неверный идентификатор

Решение: переименуйте имя столбца Oracle во все заглавные буквы.

2 голосов
/ 16 марта 2017

проверьте положение аннотации столбца в Java-классе для поля. Например, рассмотрим одну таблицу с именем STUDENT с 3 столбцами (Name, Roll_No, Marks).

Затем убедитесь, что вы добавили аннотацию нижестолбец перед методом получения вместо метода установки.Это решит вашу проблему @ Столбец (имя = "Имя", длина = 100)

**@Column(name = "NAME", length = 100)
public String getName() {**
    return name;
}

    public void setName(String name) {
    this.name= name;
}
1 голос
/ 20 апреля 2011

Сравнивали ли вы определения таблиц в Prod и Dev?

А когда вы запускаете его в SQL Developer, вы выполняете запрос в Prod (той же базе данных, что и приложение) и с тем же пользователем?

Если есть дополнительные столбцы, которые выдобавляются (с помощью команды alter), и эти изменения еще не переданы в prod, эта проблема возможна.

Можете ли вы опубликовать определение таблицы и ваш фактический запрос?

0 голосов
/ 02 июня 2011

Я использую Toad для Oracle, и если таблица принадлежит другому имени пользователя, отличному от того, в котором вы вошли, и у вас есть доступ для чтения таблицы, вам все равно может понадобиться добавить владельца таблицы в имя таблицы.

Например, допустим, имя владельца таблицы - «OWNER1», а вы вошли как «USER1». Этот запрос может дать вам ошибку ORA-00904:

select * from table_name where x='test';

Префикс имени таблицы с владельцем таблицы устраняет ошибку и дает результаты:

select * from 
0 голосов
/ 20 апреля 2011

Проверьте учетные данные, используемые для входа в базу данных. (persistence.xml ??). В основном проблема заключается в том, что имя пользователя \ пароль, используемые для входа в базу данных, не имеют видимости для объекта (в данном случае table_name). (попробуйте войти в sql developer, используя то же имя пользователя \ пароль, что и в вашем источнике данных)

...