Hibernate и сложный запрос
От: lexius www.acula.org
Дата: 05.04.08 20:02
Оценка:
Никак не могу составить правильно запрос.
Задача такова:
есть объекты, кот. содержат коллекцию других объектов (например сообщение и список пользователей, кот. его прочитали)
Нужно подсчитать количество объектов, в коллекции кот. нет конктетного пользователя (количество непрочитанных сообщений).
Подскажите правильный путь.
Заранее благодарен.
************
www.acula.org
Re: Hibernate и сложный запрос
От: Аноним  
Дата: 06.04.08 08:36
Оценка:
Здравствуйте, lexius, Вы писали:

L>есть объекты, кот. содержат коллекцию других объектов (например сообщение и список пользователей, кот. его прочитали)

L>Нужно подсчитать количество объектов, в коллекции кот. нет конктетного пользователя (количество непрочитанных сообщений).

select count(*) from Comment c1 where c1.id not in (select c2.id from Comment c2 inner join c2.user)

За абсолютную точность не ручаюсь, но как-то так.
Re[2]: Hibernate и сложный запрос
От: Аноним  
Дата: 06.04.08 10:27
Оценка:
Здравствуйте, Аноним, Вы писали:


А>select count(*) from Comment c1 where c1.id not in (select c2.id from Comment c2 inner join c2.user)


А>За абсолютную точность не ручаюсь, но как-то так.


Тут я ступил, конечно. Связь же будет many-to-many через вспомогательную таблицу. Однако можифицировать запрос не составит труда, так что оставляю развитие вопроса автору топика.
Re[3]: Hibernate и сложный запрос
От: lexius www.acula.org
Дата: 06.04.08 17:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:



А>>select count(*) from Comment c1 where c1.id not in (select c2.id from Comment c2 inner join c2.user)


А>>За абсолютную точность не ручаюсь, но как-то так.


А>Тут я ступил, конечно. Связь же будет many-to-many через вспомогательную таблицу. Однако можифицировать запрос не составит труда, так что оставляю развитие вопроса автору топика.


Работает, спасибо.
Возник еще один вопрос, хотя это немного выходит за рамки темы — как вложенный select повлияет на производительность при большом числе строк в таблице?
************
www.acula.org
Re[4]: Hibernate и сложный запрос
От: Аноним  
Дата: 07.04.08 05:46
Оценка:
Здравствуйте, lexius, Вы писали:

L>Работает, спасибо.

L>Возник еще один вопрос, хотя это немного выходит за рамки темы — как вложенный select повлияет на производительность при большом числе строк в таблице?

А тут только explain подскажет. Но вообще не очень чтобы хорошо. Это был пример навскидку, а если немного подумать, то запрос можно вывернуть и без подзапросов.

Структура — Comment, UserComment (связь между User и Comment)

select count(*) from Comment c left outer join c.userComment uc where uc.id is null group by c.id

Тоже без проверки, но смысл должен быть ясен.
Re[5]: Hibernate и сложный запрос
От: .rt http://go4sc.com
Дата: 07.04.08 07:39
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Структура — Comment, UserComment (связь между User и Comment)


Прошу прощения, поправлюсь, хоть это и не имеет значения:
структура Comment, UserComment, User.

p.s. решил зарегистрироваться всё-таки.
---
Artem Luzhnov
Go4 Software Development & Consultancy Services
Re[6]: Hibernate и сложный запрос
От: lexius www.acula.org
Дата: 07.04.08 20:07
Оценка:
Здравствуйте, .rt, Вы писали:

.rt>Здравствуйте, Аноним, Вы писали:



А>>Структура — Comment, UserComment (связь между User и Comment)


.rt>Прошу прощения, поправлюсь, хоть это и не имеет значения:

.rt>структура Comment, UserComment, User.

.rt>p.s. решил зарегистрироваться всё-таки.


Немного покрутив, в оригинале запрос теперь выглядит так:


select count(b.id) from Bid as b left join b.project as bp where bp.user.id = :puserId and bp.user not in elements(b.readedUsers)



hibernate генерирует следующий sql:


select
        count(bid0_.id) as col_0_0_ 
    from
        bids bid0_ 
    left outer join
        projects project1_ 
            on bid0_.project_id=project1_.id 
    where
        project1_.owner_id=? 
        and (
            project1_.owner_id not in  (
                select
                    readeduser2_.user_id 
                from
                    bids_readed_users readeduser2_ 
                where
                    bid0_.id=readeduser2_.bid_id
            )
        )


Как переписать без вложенного select я пока затрудняюсь. По крайней мере сходу правильно сделать не получилось.
************
www.acula.org
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.