Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate problem with setParameterList / 16 сообщений из 16, страница 1 из 1
12.08.2013, 18:15:09
    #38363674
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
Пишу такой запрос:
Код: java
1.
2.
3.
4.
5.
6.
String sql = "select candidate_skill.candidate_id from candidate_skill " +
				"inner join skill on  skill.id = candidate_skill.skill_id  " +
				"where skill_id in :skillIdList group by candidate_skill.candidate_id " +
				"Having count(candidate_skill.candidate_id) = (select count(*) from skill where skill.id in (:skillIdList) )";
		Query query = session.createSQLQuery(sql).setParameterList("skillIdList", skills);
		List<Integer> candidatesIdList = query.list();


по логам хибера видно:
авторHibernate: select candidate_skill.candidate_id from candidate_skill inner join skill on skill.id = candidate_skill.skill_id where skill_id in (?, ?) group by candidate_skill.candidate_id Having count(candidate_skill.candidate_id) = (select count(*) from skill where skill.id in ?, ? )

получается 1 раз вокруг автор:skillIdList он ставит скобочки, а второй раз - нет.

Почему такое странное поведение?
...
Рейтинг: 0 / 0
12.08.2013, 18:16:45
    #38363676
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
ошибка:

Код: java
1.
2.
3.
4.
5.
6.
String sql = "select candidate_skill.candidate_id from candidate_skill " +
				"inner join skill on  skill.id = candidate_skill.skill_id  " +
				"where skill_id in :skillIdList group by candidate_skill.candidate_id " +
				"Having count(candidate_skill.candidate_id) = (select count(*) from skill where skill.id in :skillIdList )";
		Query query = session.createSQLQuery(sql).setParameterList("skillIdList", skills);
		List<Integer> candidatesIdList = query.list();



код такой изначально.Вышеуказанный мне пришлось написать, чтобы это всё заработало.
...
Рейтинг: 0 / 0
12.08.2013, 19:50:06
    #38363775
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
redwhite90
Код: sql
1.
2.
"where skill_id in :skillIdList group by candidate_skill.candidate_id " +
"Having count(candidate_skill.candidate_id) = (select count(*) from skill where skill.id in :skillIdList )"

Порядок следования частей стейтмента (having и where) точно не перепутан?
Ну и не факт, что подзапрос в having - хорошая идея, даже если синтаксис/СУБД это допускают.

P.S. [src java] на [src sql]
...
Рейтинг: 0 / 0
12.08.2013, 20:11:45
    #38363796
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
Basil A. Sidorov,

всё правильно с последовательностью...сначала where потом having

а что такого в вложенном запросе внутри having?
...
Рейтинг: 0 / 0
12.08.2013, 20:12:29
    #38363798
свеном
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
redwhite90 ,
Да хз, почему он не обернул. А почему он должен был обернуть? В примере http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Query.html#setParameterList(java.lang.String, java.lang.Object[])]здесь они руками обернули в скобки.

Basil A. SidorovНу и не факт, что подзапрос в having - хорошая идея, даже если синтаксис/СУБД это допускают.Я бы поостерегся делать такие заявления. Что плохого в подзапросе в havaing? Ну подзапрос и подзапрос, having и having. Скорость выполнения запроса беспокоит? Да вроде нет. Ну значит ничего плохого в этом нет.
Вот будет беспокоить запрос - тогда да, надо смотреть на план, и искать проблему. В противном случае это будет "premature optimization", которая ни к чему хорошему не приводит.
...
Рейтинг: 0 / 0
12.08.2013, 20:20:11
    #38363805
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
redwhite90всё правильно с последовательностью...сначала where потом havingДа, был неправ.
Ну тогда остаётся вбить запрос с образцами аргументов в какой-нибудь sqlplus и увидеть результат.
...
Рейтинг: 0 / 0
12.08.2013, 20:22:15
    #38363807
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
свеном,

поиск по странице ключевой фразы авторsetParameterList не дал результата примера использования и соответственно непонятно что он в примере обернул

Я бы не удивился, если бы он и там и там обернул, либо ни там ни там, а то он в одном месте оборачивает, в другом нет, как девушка прямо.
...
Рейтинг: 0 / 0
12.08.2013, 20:24:20
    #38363808
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
Тогда остаётся еще один вопрос: почему в тексте вашего запроса в первый раз скобки не ставятся, а во второй - ставятся?
Насколько я вижу - первый вариант hibernate обрабатывает корректно.
...
Рейтинг: 0 / 0
12.08.2013, 20:27:40
    #38363813
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
Basil A. Sidorov,
я увидел лог, да и подправил, чтобы работало
...
Рейтинг: 0 / 0
12.08.2013, 20:30:24
    #38363815
свеном
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
redwhite90свеном,

поиск по странице ключевой фразы авторsetParameterList не дал результата примера использования и соответственно непонятно что он в примере обернул

Я бы не удивился, если бы он и там и там обернул, либо ни там ни там, а то он в одном месте оборачивает, в другом нет, как девушка прямо.Вот сслыка, скопируйте е от и до вместе с пробелом, там в описании метода пример http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Query.html#setParameterList(java.lang.String, java.lang.Object[])
...
Рейтинг: 0 / 0
12.08.2013, 20:41:18
    #38363826
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
Если я всё правильно понимаю, то без доп.оберток в параметризованных запросах есть только позиционные параметры маркируемые знаками вопроса.
Таким образом, без сахарка в виде именованных параметров вам пришлось бы самостостоятельно на писать в "in (...)" вместо многоточия столько знаков вопросов, сколько элементов списка вы собрались передать, да ещё и правильно "разбавить" их запятыми.
Хибер облегчает вашу жизнь, но т.к. людям свойственно ошибаться - он может делать это неправильно.
"Как-то так" (ц) Винни-Пух
...
Рейтинг: 0 / 0
12.08.2013, 20:44:16
    #38363830
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
свеном,

да)
...
Рейтинг: 0 / 0
13.08.2013, 12:38:44
    #38364491
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
Basil A. Sidorov,

наверное)

Вдогонку спрошу, есть ли смысл переписывать такой запрос на hql?
...
Рейтинг: 0 / 0
13.08.2013, 13:04:48
    #38364536
свеном
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
redwhite90Вдогонку спрошу, есть ли смысл переписывать такой запрос на hql?Писать запросы на HQL имеет смысл, если:
1) Вам нужна переносимость приложения между базами данных. Т.е. сегодня SQL Server, завтра Oracle. В реальности это просто маркетинговый бред. Единственное, это может быть полезно для тестов.
2) У вас есть договоренность в команде писать по максимуму на HQL, например, потому что другие ваши коллеги не секут в SQL синтаксисе определенной СУБД.
Все. На этом причины использовать HQL заканчиваются.
...
Рейтинг: 0 / 0
13.08.2013, 13:28:28
    #38364581
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
Мне кажется, запрос можно слегка оптимизировать:
- не нужен join с таблицей skill, достаточно чтобы candidate_skill.skill_id in (:skillIdList)
- не нужен вложенный запрос в конце, так как количество заранее известно и его можно передать вторым параметром (skills.size()). Конечно, при условии, что список skills валидный
Ну, а после этого попытаться сделать на hql. Переносимость системы - важное преимущество, что бы там ни говорили. Если это не legacy система, с которой уже ничего не поделаешь, лучше попытаться.
...
Рейтинг: 0 / 0
13.08.2013, 13:50:49
    #38364630
свеном
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem with setParameterList
ivanraМне кажется, запрос можно слегка оптимизировать:
- не нужен join с таблицей skill, достаточно чтобы candidate_skill.skill_id in (:skillIdList)
- не нужен вложенный запрос в конце, так как количество заранее известно и его можно передать вторым параметром (skills.size()). Конечно, при условии, что список skills валидный
Ну, а после этого попытаться сделать на hql. Переносимость системы - важное преимущество, что бы там ни говорили. Если это не legacy система, с которой уже ничего не поделаешь, лучше попытаться."Переносимость системы" это фикция, маркетинговая байка. Когда создают типичное трехзвенное приложение, то:
- либо база данных изветсна наперед, лицензии закуплены, менять ее никто не собирается. В этом случае переносимость нафиг никому не сдалась.
- с выбором БД еще не определились, или же она будет скорее всего бесплатной, или еще что-то, что говорит в пользу того, что переезжать возможно придется. В этом случае переносимость оправдана.

Более того, как только приложение преодолевает некую планку по сложности или требованиям к производительности, переносимость не то, что не помогает, она начинает тянуть приложение на дно, так как на HQL запросах вы не можете выжать из СУБД все соки.
Наконец, в реальной жизни практически никогда не бывает "гладких переездов", когда БАЦ - и ты пересел на новую СУБД без изменения кода. Не бывает такого. Взять хотя бы аннотации для ключей - на SQL Server это identity, а на Oracle - это сиквенсы. И все, приехали - надо лезть менять код. И среди всех таких изменений, переписать несколько дестяков кастомных запросов - это одна из самых простых задач, на которую уйдет от силы несколько дней. Это капля в море по сравнению с развертыванием новой СУБД, ее настройкой, администрированием, и профилированием перформанса, на которые могут уходить месяцы.
Так что пишите себе спокойно обычный SQL и не парьтесь, если у вас нет каких-то явных причин писать переносимый код. А абстрактное "а вдруг мы переедем на другую СУБД в будущем" оставьте предсказамусам.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate problem with setParameterList / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]