спящий нативный SQL-запрос - PullRequest
3 голосов
/ 19 мая 2011

Я хочу выполнить собственный 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();

Я действительно не знаю, что делаю неправильно, и был бы очень признателен за некоторыеhelp.

tnx заранее

EDIT:

сгенерированный 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.

Ответы [ 4 ]

0 голосов
/ 11 августа 2016

Да, удаление псевдонима сработало, но это проблема, если у вас есть 2 таблицы, каждая с столбцом с именем name.

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

0 голосов
/ 04 марта 2014

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

Это связано с MySQL-JDBC. Добавьте [useOldAliasMetadataBehavior = true] к URL-адресу JDBC в файле конфигурации. Источник: http://bugs.mysql.com/bug.php?id=31499

0 голосов
/ 19 мая 2011

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

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

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