Как создать запрос JPA для возврата объектов в порядке убывания количества удаленных ссылок? - PullRequest
2 голосов
/ 04 марта 2011

У меня есть отношение @OneToMany от Category.comparisons к Comparison.category (и отношение @ManyToOne в другом направлении).

Мой объект сравнения имеет поле "дата", а мой объект категории имеет логическое "безопасное" поле.

Я хочу получить 10 объектов Category, которые имеют наибольшее количество сравнений после даты, которую я передаю в запрос, и где Category.safe имеет значение true.

Вот мое лучшее усилие, но оно совсем не работает:

SELECT c FROM Category c JOIN Category.comparisons 
  WHERE c.safe = true AND c.comparisons.date > :afterDate 
  ORDER BY COUNT(Category.comparisons) DESC

Я мог бы сделать это достаточно легко в нативном MySQL, но у меня возникли серьезные проблемы с тем, как разобраться, как JPA обрабатывает ссылки на внешние ключи, и различными другими различиями в синтаксисе между SQL и языком запросов JPA.

Как мне сделать то, что я пытаюсь сделать?

Ответы [ 2 ]

1 голос
/ 05 марта 2011

Используйте функцию size () в предложении ORDER BY и исправьте JOIN, чтобы использовать ранее определенный псевдоним c (для категории), и назначьте ему другой псевдоним co. Используйте этот псевдоним в предложении WHERE:

SELECT c FROM Category c JOIN c.comparisons co
 WHERE c.safe = true AND co.date > :afterDate 
 ORDER BY size(c.comparisons) DESC

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

SELECT DISTINCT c FROM Category c JOIN c.comparisons co
 WHERE c.safe = true AND co.date > :afterDate 
 ORDER BY size(c.comparisons) DESC

Опять же, обратите внимание, что вы должны знать, что делаете при применении DISTINCT, поскольку к ним обращаются больше данных, чем показывает запрос, что в дальнейшем может привести к проблемам с производительностью.

1 голос
/ 04 марта 2011

Мои JPA-соединения выглядят следующим образом:

SELECT b FROM Befund b JOIN b.befundgruppe g WHERE g.idbefundgruppe = ?1

Обратите внимание на псевдоним g для объединенной таблицы. Может быть, это поможет

В целях отладки вы можете добавить в файл persistence.xml следующее:

<properties>
      <property name="eclipselink.logging.level" value="FINEST"/>
</properties>

внутри элемента persistence-unit. Затем загляните в журнал, чтобы увидеть, как JPA переводится в SQL.

С наилучшими пожеланиями

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