Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Нативные SQL запросы в Hibernate и оператор exists


Автор: megaproger 25.7.2006, 16:34
Здравствуйте !
У меня такая проблема: использую нативный 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 
 

Автор: tux 26.7.2006, 07:27
Включи в Hibernate показ запросов, которые он выполняет и посмотри в логе что за запрос в результате получается. Может быть Hibernate что-то неправильно интерпретирует, например exists принимает за ключевое слово. 

Автор: megaproger 26.7.2006, 09:56
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) 

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

Тебе нужно просто убрать все конструкции Hibernate внутри EXISTS() (они ведь там не нужны - в объект результат этого запроса не выдается) и оставить простой нативный запрос к БД и убрать из массивов описание класса Relations. 

Автор: megaproger 26.7.2006, 11:54
Огромное спасибо, всё заработало...А то бы я долго с этим мучался и всё равно бы не догадался. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)