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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hibernate запрос с участием коллекции 
V
    Опции темы
Samotnik
Дата 13.1.2011, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



привет, нужен совет с составлением запроса.
Есть коллекция чисел  List<Long> categories  - в ней, допустим: 1,4,5,7,8,10,11. 
Вопрос как подставить в запрос эту коллекцию ? Неужели кроме как доставать по значению из коллекции и подставлять в запрос, других выходов нету ? Т.е. если 10 значений, то 10 раз вызывать метод ?
PM MAIL   Вверх
MisterCleric
Дата 13.1.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Привет. 
Вот такое не подойдет?
Код

session.createQuery("from User where id in (:ids)")
                    .setParameterList("ids", ids, Hibernate.LONG)



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 13.1.2011, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



MisterCleric, я так тоже думал, сделал

Код

public List<Message> getMessagesByTenant(List<Long> categories) throws SQLException {
  Session session = null;
  try {
    session = HibernateUtil.getSessionFactory().openSession();
    return session.createCriteria(Message.class).add(Restrictions.in("category.id", categories)).list();
  } finally {
    HibernateUtil.closeSession(session);
  }
    }


но почему-то пустая коллекция ...

Это сообщение отредактировал(а) Samotnik - 13.1.2011, 12:55
PM MAIL   Вверх
MisterCleric
Дата 13.1.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Покажи запрос, который при этом сгененрировался


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 13.1.2011, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



MisterCleric, нет, извини, всё действительно работает, я случайно не те значения подставлял  smile 
PM MAIL   Вверх
Samotnik
Дата 14.1.2011, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Запрос существенно расширился, и я опять с вопросом на форум smile 
Задача примерно такая. Есть две таблицы.
Код

Category (
int id;
char name;
);
Message (
int id;
char text;
categori_id;
);
Delivery (
int id;
int id_message;
boolean sent;

Нужно выбрать сообщения, которые были отосланы, и которые небыли отосланы.
Для выбора отосланных сообщений я написал запрос:
Код

select ms from Delivery dy inner join dy.message as ms where dy.deleted=:deleted and dy.sent=:sent and ms.category.id in (:ids)

теперь нужно написать выборку для не отправленных сообщений, критерий такой: выбрать все записи из таблицы delivery у которых sent=false + все записи из message, которые не попали в delivery.  smile 
 smile 
PM MAIL   Вверх
MisterCleric
Дата 14.1.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Привет. 
Стоп! Что-то я не сильно сегодня соображаю, или что-то ты перегибаешь.
Цитата

Нужно выбрать сообщения, которые были отосланы, и которые небыли отосланы.

В чем проблема? Ведь
 отосланные + не отосланные = ВСЕ
Не так ли? Или есть еще какие-то другие сообщения?
В чем суть задачи? Может действительно достаточно выбрать все, а на клиенте фильтровать их по соответствующему признаку. Ведь связка-то у тебя между Message и Delivery


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Temdegon
Дата 14.1.2011, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я так понял, что неотосланные сообщения добавляются в delivery с признаком sent=false, а могут и вообще не попасть в delivery и быть только в message.
PM MAIL   Вверх
MisterCleric
Дата 14.1.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Temdegon

Не-не. Человек явно написал:
Цитата

все записи из message, которые не попали в delivery




--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 14.1.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



MisterCleric, да, спасибо, ты меня натолкнул на мысль, я просто буду передавать флаг, какие сообщения нужно вернуть отосланные или нет. Если отосланные, то буду возвращать результат выборки, если нет, то буду общему результату делать removeAll() - куда передам результат выборки отосланных. Получится, что из общего результата удаляться отосланные, следовательно я получу список не отосланных, верно ? )
PM MAIL   Вверх
Temdegon
Дата 14.1.2011, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тогда можно использовать условие
where ms.category.id NOT in (:ids)
и передать коллекцию отправленных
PM MAIL   Вверх
MisterCleric
Дата 14.1.2011, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Ну как я понял, можно решить на уровне запроса (правда нативного):
Код

SELECT m.* FROM MEssage m, Delivery d
WHERE m.id= d.messageId(+) AND nvl(d.send,false) = false




--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 14.1.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



MisterClericTemdegon, т.е. то, что я написал не верно ? Без запроса не обойтись ?

Добавлено через 2 минуты и 4 секунды
Появилось новое условие  smile 
В таблице Message есть еще одно поле - время создания. Так вот, в метод будут приходить еще два параметра в виде Date dateFrom, Date dateTo, как в эту выборку что у меня есть, подставить еще эти две даты, т.е. чтобы сообщения были выбраны с учетом этого периода. smile
Код

select ms from Delivery dy inner join dy.message as ms 
   where dy.deleted=:deleted and dy.sent=:sent and ms.category.id in (:ids)

PM MAIL   Вверх
MisterCleric
Дата 14.1.2011, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



between тебе в помощь.
Ну или зависит от inclusive/exclusive начала-конца периода.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 14.1.2011, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



MisterCleric, ага, я уже тоже нашел
Код

select ms from Delivery dy
    inner join dy.message as ms where dy.deleted=:deleted and dy.sent=:sent
    and ms.timestamp between :dateFrom and :dateTo
    and ms.category.id in (:ids)

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

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

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


 




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


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

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