HQL: как сохранить порядок сортировки при извлечении полных строк с использованием конструкции where-in-subselect? - PullRequest
1 голос
/ 09 февраля 2011

В настоящее время я создаю функцию, подобную «другим людям, которым это тоже нравится».

Соответствующий оператор HQL возвращает список идентификаторов продуктов (упорядоченный по количеству общих «лайков» между двумя продуктами). Но результат не внятный - если разобраться до самых основ, запрос выглядит примерно так. (Обратите внимание: это не оригинальный запрос, а упрощенный пример, чтобы дать вам представление о том, что я делаю)

select prd2.id from UserLike ul2
join ul2.product prd2
where ul.userId in (
    select ul.userId from UserLike ul
    join ul.product prd
    where prd.id=:productId
)
group by prd2.id
order by count(prd2.id) desc

Исходя из этого, существует ли общий шаблон для получения полной строки / объекта для каждого продукта?

В SQL я бы использовал приведенный выше запрос в качестве подвыбора в рамках FROM и присоединился бы к таблице продуктов.

Поскольку HQL не поддерживает подвыборы внутри FROM, я не думаю, что есть другой способ, кроме как обернуть

from product p where p.id in (SUBSELECT_AS_ABOVE)

но идет сортировка. (

Может быть, это звучит немного странно, но я думаю, что это общий случай использования - есть ли какие-нибудь общие обходные пути для этого?

Большое спасибо заранее и наилучшими пожеланиями, Peter

1 Ответ

1 голос
/ 09 февраля 2011

Вы можете сделать это в два этапа: 1. Получить список, если ID (что вы уже сделали); 2. Получить все продукты по списку идентификаторов. Это можно сделать с помощью Expression.In («Id», idList), где idList - это результат IList из первого запроса.

Также, если возможно, попробуйте сделать все без HQL, но с критериями и ограничениями.

...