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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический запрос HQL с параметром типа .class 
:(
    Опции темы
isabsent
Дата 19.8.2011, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

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



В HQL есть возможность запросить выборку по имени класса from Cat cat where cat.class = DomesticCat. Мне нужно динамически сформировать указанного типа запрос с параметрами, в котором есть один параметр типа .class, а количество остальных параметров заранее не известно. На сколько я понимаю, использовать NamedQuery с параметрами в этом случае нельзя, так как пустые параметры приводят к Excepton. Использовать Criteria тоже не могу - по каким-то причинам 
Код

Restrictions.like("cat.class = ", obtainClassName())

приводит к Exception.
Единсвенное, что удалось сделать - динамически сформировать SQL-строку конкатенацией (из кусочков, выбранных пользователем в процессе формирования запроса) типа
Код

"FROM Operation o WHERE o.category.account.username = '" + getUsername() + "'"
    " AND o.wallet.name = '" + getWalletName() + "'"
       //Добавляем другие параметры в зависимости от того что пользователь натыкает
    " AND o.category.class = " + getClassName()

что не есть хорошо с точки зрения безопасности 
Куды бедному крестьянину податься?
 

Это сообщение отредактировал(а) isabsent - 19.8.2011, 07:38
PM MAIL   Вверх
tux
Дата 21.8.2011, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


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

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



Цитата(isabsent @  19.8.2011,  07:33 Найти цитируемый пост)
Куды бедному крестьянину податься?

Направление вроде правильное, а ваша проблема с безопасностью легко решается. Вообще конкатенация параметров в запрос настоятельно не рекомендуется именно по этой причине. Но ведь можно использовать именованные параметры. Например, 
Код

String hql = "FROM Operation o WHERE o.category.account.username = :username" 
    " AND o.wallet.name = :wallet" + 
    " AND o.category.class = :className";
Query query = session.createQuery(hql);
query.setString("username", getUsername());
...
List results = query.list();

Ну и так далее. В этом случае Hibernate использует PreparedStatement, подставляя параметры и проблема связанная с тем что пользователь может засабмитить куски запроса не возникает в принципе.
PM MAIL Skype GTalk Jabber YIM   Вверх
isabsent
Дата 21.8.2011, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 30.5.2010

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



Я понимаю что нужно использовать именованные параметры. Проблема, как я написал выше, была в 
Цитата

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

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

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


 




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


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

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