#java #mysql #sql #hibernate
#java #mysql #sql #переход в спящий режим
Вопрос:
я хочу выполнить собственный SQL-запрос в hibernate 3.5.
я использую mysql 5 в качестве СУБД, протестировал запрос в mysqlworkbench и получаю нужные данные.
итак, я создал объект SqlQuery в своем Java-коде, установил строку запроса и необходимый параметр.
после выполнения запроса я получаю исключение, в котором говорится:
org.hibernate.exception.SQLGrammarException: could not execute query
....
Caused by: java.sql.SQLException: Column 'name' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1145)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5617)
at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:225)
at org.hibernate.type.StringType.get(StringType.java:41)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:210)
мой запрос (который отлично работает при непосредственном выполнении на сервере):
select site.name as constructionSiteName, site.id as constructionSiteId, com.name,
sum(pos.sum_checked_brutto) as sumCheckedBrutto,
sum(pos.sum_checked_netto) as sumCheckedNetto
from constructionsite site
inner join costunit cu on site.id = cu.constructionsite
inner join costunit_position pos on pos.costunit_id = cu.id
inner join company com on pos.company_id = com.id
where com.id = 57
group by site.id;
вот как я создаю строку запроса в своем Java-коде:
String queryString = "select site.name as constructionSiteName, site.id as constructionSiteId, "
"sum(pos.sum_checked_brutto) as sumCheckedBrutto, sum(pos.sum_checked_netto) as sumCheckedNetto "
"from constructionsite site "
"inner join costunit cu on site.id = cu.constructionsite "
"inner join costunit_position pos on pos.costunit_id = cu.id "
"inner join company com on pos.company_id = com.id "
"where com.id = ? "
"group by site.id ";
затем я устанавливаю его в объект SqlQuery и устанавливаю параметр:
SQLQuery query = getSession().createSQLQuery(queryString);
query.setLong(0, companyId);
Последний шаг — «выполнить» запрос с:
List result = query.list();
я действительно не знаю, что я делаю не так, и был бы очень признателен за некоторую помощь.
tnx заранее
Редактировать:
сгенерированный оператор sql, выполняемый hibernate:
2011-05-19 10:42:50,143 DEBUG SQL:111 - select site.name as constructionSiteName,
site.id as constructionSiteId, sum(pos.sum_checked_brutto) as sumCheckedBrutto,
sum(pos.sum_checked_netto) as sumCheckedNetto
from constructionsite site
inner join costunit cu on site.id = cu.constructionsite
inner join costunit_position pos on pos.costunit_id = cu.id
inner join company com on pos.company_id = com.id where com.id = ?
group by site.id
я также нашел это в выходных данных сервера:
2011-05-19 10:42:50,159 INFO StringType:203 - could not read column value from result set: name; Column 'name' not found.
Комментарии:
1. ps: пожалуйста, не путайте имена таблиц и столбцов. 😀
2. можете ли вы напечатать фактическое значение queryString после назначения
3. 2011-05-19 10:42:50,143 ОТЛАЖИВАТЬ SQL:111 — выбрать site.name как constructionSiteName, site.id в качестве идентификатора объекта конструкции, sum (поз.sum_checked_brutto) в качестве sumCheckedBrutto, sum (поз.sum_checked_netto) в качестве sumCheckedNetto из модуля внутреннего соединения сайта constructionsite cu на site.id = cu.constructionsite внутреннее объединение costunit_position pos на pos.costunit_id = cu.id внутренняя регистрация company com на pos.company_id = com.id где com.id = ? сгруппировать по site.id 2011-05-19 10:42:50,159 INFO StringType: 203 — не удалось прочитать значение столбца из результирующего набора: name; Столбец ‘name’ не найден.
4. Выполненный вами запрос включает «com.name «, но не запрос, который вы выполнили через java. Я не уверен, является ли это проблемой, хотя
5. почему вы добавляете префикс site.* ко всем параметрам?
Ответ №1:
Пожалуйста, дважды проверьте, что в таблице site
есть столбец с именем name
. (Будьте осторожны: имена таблиц MySQL могут быть чувствительны к регистру в зависимости от конфигурации и базовой ОС.)
Дважды проверьте, что ваше приложение использует ту же базу данных, в которой вы выполняете запрос из SQL-клиента. Возможно, у вас есть среда тестирования и производства с двумя разными версиями table site
.
Комментарии:
1. я попробовал то же самое с простым запросом типа
select site.name from constructionsite site
и получаю ожидаемый набор результатов без ошибок.2. я понимаю. попробуйте пошагово создать желаемый запрос и посмотреть, где что-то пошло не так .. 🙂
3. ОК. пожалуйста, не забудьте ответить на ваш вопрос, если у вас есть решение, вот как обстоят дела здесь. удачи.
4. хотел ответить на свой собственный вопрос, но «компьютер говорит «нет» … мне приходится ждать 8 часов, пока я не смогу опубликовать ответ: D проблема заключалась в псевдониме
constructionSiteName
, если я оставлю его — все работает нормально5. В чем была проблема? Я сталкиваюсь с аналогичной ошибкой, когда она работает, когда я запускаю ее в sqlplus, но не в моем запросе hibernate на java.
Ответ №2:
Попробуйте удалить псевдонимы столбцов из SQL. Я столкнулся с подобной проблемой ранее, и это исправило ее для меня. Некоторые собственные SQL-запросы при запуске в режиме гибернации не учитывают псевдонимы столбцов. Я не уверен, почему это происходит.
Ваш запрос будет select site.name , site.id , com.name,
sum(pos.sum_checked_brutto) ,
sum(pos.sum_checked_netto)
from constructionsite site
inner join costunit cu on site.id = cu.constructionsite
inner join costunit_position pos on pos.costunit_id = cu.id
inner join company com on pos.company_id = com.id
where com.id = 57
group by site.id;
Ответ №3:
Это связано с MySQL-JDBC. Добавьте [useOldAliasMetadataBehavior=true] к URL-адресу JDBC в файле конфигурации. Источник: http://bugs.mysql.com/bug.php?id=31499
Ответ №4:
да, удаление псевдонима сработало, но это проблема, если у вас есть 2 таблицы, в каждой из которых есть столбец с именем.
Однако, если я поставлю ifnull(site.name)
, это, похоже, сработает. Понятия не имею, почему.
Комментарии:
1. «Понятия не имею, почему» не поможет, ответ нуждается в уточнении.