Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нативные SQL запросы в Hibernate и оператор exists 
V
    Опции темы
megaproger
Дата 25.7.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 25.7.2006
Где: Москва

Репутация: нет
Всего: нет



Здравствуйте !
У меня такая проблема: использую нативный SQL  в Hibernate,
пишу запрос типа:


 Query sqlQuery = HibernateUtil.currentSession().createSQLQuery("select {EntitiesFieldValues.*} from entitiesfieldsvalues {EntitiesFieldValues} " +
                            " where EXISTS (select id as {Relations.id},id1 as {Relations.id1},id2 as {Relations.id2}                   
 from relations rel where rel.id2=4268) 
 , new String[]{"EntitiesFieldValues","Relations"}, new Class[]{EntitiesFieldValues.class,Relations.class});


при выполнении  запроса  вываливается Exception:

20:16:56,421  WARN main JDBCExceptionReporter.logExceptions:57 - SQL Error: 0, SQLState: 42703
20:16:56,421 ERROR main JDBCExceptionReporter.logExceptions:58 - Имя колонки id1_ не найдено в этом ResultSetе.

При различных перестановках понятно,что  под id1_  подразумевается Relations
Хотя если делать выборку из этих таблиц отдельно таким же методом, то всё работает и Relations
воспринимается нормально.

Подразумеваю что всё из за exists, может кто подскажет что делать? Без EXISTS мне никак не обойтись smile 
 
PM MAIL   Вверх
tux
Дата 26.7.2006, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Включи в Hibernate показ запросов, которые он выполняет и посмотри в логе что за запрос в результате получается. Может быть Hibernate что-то неправильно интерпретирует, например exists принимает за ключевое слово. 
PM MAIL Skype GTalk Jabber YIM   Вверх
megaproger
Дата 26.7.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 25.7.2006
Где: Москва

Репутация: нет
Всего: нет



show_sql у меня включено - лог эксепшена был взят оттуда, просто если "Relations" стоит на первом месте то жалуется на id0_ , если  на втором то на id1_ , на exists жалоб нет. Использую нативные запросы для того ,что нужно слово Union  в дальнейшем,которое Hibernate не понимает.

Добавлено @ 10:00 
Вот сформированный  Hibernate запрос :

select EntitiesFieldValues.id as id0_, EntitiesFieldValues.value as value0_, EntitiesFieldValues.fieldsid as fieldsid0_, EntitiesFieldValues.primarykeyfieldvalueid as primaryk4_0_, EntitiesFieldValues.date as date0_ from entitiesfieldsvalues EntitiesFieldValues  where EXISTS (select id as id1_,id1 as id11_,id2 as id21_  from relations rel where rel.id2=4268)
Hibernate: select EntitiesFieldValues.id as id0_, EntitiesFieldValues.value as value0_, EntitiesFieldValues.fieldsid as fieldsid0_, EntitiesFieldValues.primarykeyfieldvalueid as primaryk4_0_, EntitiesFieldValues.date as date0_ from entitiesfieldsvalues EntitiesFieldValues  where EXISTS (select id as id1_,id1 as id11_,id2 as id21_  from relations rel where rel.id2=4268) 
PM MAIL   Вверх
tux
Дата 26.7.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



А, все, понял. В общем так... Hibernate именует каждое поле в результате по своему чтобы потом найти его в результате запроса. В твоем случае конструкции типа {Relations.id} он заменяет на id##, а потом пытается найти в ResultSet чтобы сформировать объект. Но прикол в том, что в ResultSet этих полей-то и нет, ведь результат запроса внутри EXISTS() у тебя используется лишь для того, чтобы определить наличие записей, соответствующих условию. 

Тебе нужно просто убрать все конструкции Hibernate внутри EXISTS() (они ведь там не нужны - в объект результат этого запроса не выдается) и оставить простой нативный запрос к БД и убрать из массивов описание класса Relations. 
PM MAIL Skype GTalk Jabber YIM   Вверх
megaproger
Дата 26.7.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 25.7.2006
Где: Москва

Репутация: нет
Всего: нет



Огромное спасибо, всё заработало...А то бы я долго с этим мучался и всё равно бы не догадался. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.