ошибка встроенного SQL-запроса в режиме гибернации

#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. «Понятия не имею, почему» не поможет, ответ нуждается в уточнении.