2011-05-19 3 views
3

Я хочу выполнить собственный SQL-запрос в hibernate 3.5.hibernate native SQL query error

Я использую mysql 5 как dbms, проверял запрос в 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 и установил t он Param:

SQLQuery query = getSession().createSQLQuery(queryString); 
query.setLong(0, companyId); 

Последний шаг «выполнить» запрос с:

List result = query.list(); 

я действительно не знаю, что я делаю неправильно, и был бы очень признателен некоторую помощь.

Тпх заранее

EDIT:

сгенерированный SQL Statement выполняется спячки:

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. 
+0

ps: пожалуйста, не путайте имена таблиц и столбцов. : D – theFriedC

+0

Вы можете распечатать фактическое значение queryString после назначения –

+0

2011-05-19 10: 42: 50,143 DEBUG SQL: 111 - выберите имя сайта как constructionSiteName, site.id как constructionSiteId, sum (pos.sum_checked_brutto) как sumCheckedBrutto, sum (pos.sum_checked_netto) как sumCheckedNetto из сайта siteite site join join.id = cu.constructionsite внутреннее соединение costunit_position pos on pos.costunit_id = cu.id внутреннее объединение company com on pos.company_id = com.id, где com.id =? group by site.id 2011-05-19 10: 42: 50,159 INFO StringType: 203 - не удалось прочитать значение столбца из набора результатов: name; Имя столбца не найдено. – theFriedC

ответ

0

Пожалуйста дважды проверьте, что таблица site имеет столбец с именем name. (Будьте осторожны: имена таблиц MySQL могут быть чувствительны к регистру в зависимости от конфигурации и базовой ОС.)

Дважды проверьте, что ваше приложение использует ту же базу данных, в которой выполняется запрос от клиента SQL. Возможно, у вас есть тестовая и производственная среда с двумя разными версиями таблицы site.

+0

Я пробовал то же самое с простым запросом типа' select site.name from constructite site', и я получаю ожидаемый результат без ошибок. – theFriedC

+0

я вижу. попробуйте поэтапно построить свой желаемый запрос и посмотреть, где он пойдет не так. :-) – jabal

+0

да - это то, что я пытаюсь сделать прямо сейчас;) – theFriedC

0

Попробуйте удалить имена псевдонимов столбца из 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;

0

Да, удаление сработавшего псевдонима является проблемой, если у вас есть две таблицы, каждая из которых имеет столбец с именем name.

Однако, если я положил ifnull(site.name), это, казалось, сработало. Не знаю, почему.

+0

«Не знаю, почему» не поможет, ответ нужно уточнить. – piyushj