Упорядочение по столбцу, не входящему в группу «В» или не включенному в совокупность - PullRequest
1 голос
/ 17 декабря 2009

У меня проблема с тем, чтобы этот запрос JPA работал на MS SQL Server 2008.

Фон выглядит следующим образом: пользователи создают рабочие места для клиентов, которых много. Я показываю пользователю список его последних использовавшихся клиентов, чтобы сделать выбор проще.

SELECT DISTINCT c FROM Client c 
    JOIN c.jobs j 
    WHERE j.user = ?1 
    ORDER BY j.created DESC

Запрос работает просто отлично - используется MySQL. MS SQL Server (2008) жалуется, что я не могу отсортировать по j.created, потому что он не является частью списка выбора. Это сообщение об ошибке:

Элементы ORDER BY должны отображаться в выберите список, если SELECT DISTINCT указано.

Не могу найти элегантного обходного пути для этого ограничения. У кого-нибудь есть идея?

Ответы [ 4 ]

4 голосов
/ 17 декабря 2009

Поскольку вы выбираете отдельный c из множества, сервер Sql не будет знать, какой j. создан для заказа. Вы можете сгруппировать по c, а затем использовать агрегат для упорядочения по min или max j.created. Что-то вроде ...

SELECT c.col1, c.col2 
FROM Client c 
JOIN c.jobs j 
WHERE j.user = ?1 
Group by c.col1, c.col2
ORDER BY MIN(j.created) DESC
2 голосов
/ 17 декабря 2009

Это не ограничение SQL. Проблема в том, что сортировка не имеет смысла с точки зрения вашего запроса. Оператор Distinct собирает несколько значений C, каждое из которых может иметь разную дату создания. Так в этой ситуации, как SQL сортирует это?

C    Create  
1    1/1/2009  
2    3/1/2008  
1    12/2/2009  
9    4/1/2009  
1 голос
/ 23 июля 2014

Возможно, этот вопрос немного устарел, но я нашел более простое решение.

SELECT DISTINCT c FROM Client c 
    JOIN fetch c.jobs j 
    WHERE j.user = ?1 
    ORDER BY j.created DESC

Добавление ключевого слова fetch в объединение с указанием JPA включить поля в объединение в операторе select, чтобы mssql больше не жаловался на это.

0 голосов
/ 17 декабря 2009

Ответ Дакворта в значительной степени решил проблему, так что это только для справки.

Это была моя первая попытка после прочтения ответов утки и Джона:

SELECT c FROM Client c JOIN c.jobs j 
    WHERE j.user = ?1 
    GROUP BY c 
    ORDER BY MIN(j.created) DESC

Но прямой выбор полных объектов не влияет на предложение GROUP BY и приводит к SQLGrammarException.

Вместо этого теперь я получаю только идентификаторы, использующие этот запрос:

SELECT c.id FROM Client c JOIN c.jobs j 
    WHERE j.user = ?1 
    GROUP BY c.id 
    ORDER BY MIN(j.created) DESC

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

Спасибо всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...