| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 мне никак не обойтись |
| Автор: 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 |
| Огромное спасибо, всё заработало...А то бы я долго с этим мучался и всё равно бы не догадался. |