ВНУТРЕННЯЯ РЕШЕНИЕ проблема с JPQL (даже если запрос SQL работает) - PullRequest
0 голосов
/ 26 июня 2018

«Добрый день» (привет всем)

Я исхожу из этой темы: Как я могу выбрать строки с MAX (значение столбца), DISTINCT по другому столбцу в SQL?

Этот парень делает почти то, что мне нужно в моем проекте. На самом деле, я пытаюсь сделать что-то вроде Git: получить все экземпляры в их последней версии. В настоящее время у меня есть таблица "UM", с такими атрибутами:

  • int id (первичный ключ, автоматически генерируется)
  • Имя строки (может быть продублировано)
  • int version (1, 2, 3, [...])
  • Строка Fmr
  • [другие атрибуты, не используемые в этом случае]

У меня также есть этот запрос в SQL (который работает хорошо и возвращает желаемый результат):

SELECT * FROM agrid.um AS u INNER JOIN
        (SELECT u2.name, max(u2.version) AS MaxVersion, u2.fmr
         FROM agrid.um AS u2 WHERE u2.fmr = 'CZ2ABVIMG0000' GROUP BY u2.name, u2.fmr) umVersion
         ON u.name = umVersion.name AND u.version = umVersion.MaxVersion
         WHERE u.fmr = 'ABCDE';

Но когда я пытался сделать то же самое в JPQL, у меня появляются некоторые ошибки "JOIN":

TypedQuery<UmEty> q = getManager().getEntityManager().createQuery(
            "SELECT u FROM UmEty u INNER JOIN"
            + " (SELECT u2.name, max(u2.version) AS MaxVersion, u2.fmr "
            + " FROM UmEty u2 WHERE u2.fmr = :fmr GROUP BY u2.name, u2.fmr) umVersion"
            + " ON u.name = umVersion.name AND u.version = umVersion.MaxVersion WHERE u.fmr = :fmr", UmEty.class);
    q.setParameter("fmr", fmr);
    return q.getResultList();

Со следующим исключением:

Exception Description: Syntax error parsing
[SELECT u FROM UmEty u INNER JOIN (SELECT u2.name, max(u2.version)
AS MaxVersion, u2.fmr 
FROM UmEty u2 WHERE u2.fmr = :fmr GROUP BY u2.name, u2.fmr) umVersion
ON u.name = umVersion.name
AND u.version = umVersion.MaxVersion WHERE u.fmr = :fmr].
[33, 147] The join association path is not a valid expression.

Я также пытался просто использовать «JOIN» вместо «INNER JOIN» и некоторые другие тесты (удалить предложение «WHERE», ...), но у меня всегда выбрасывается это исключение. Я не очень знаком с JPQL и уже читал тему «INNER JOIN» на Objectdb (==> https://www.objectdb.com/java/jpa/query/jpql/from). Но даже с этой информацией, я не могу получить успешный запрос

Может кто-нибудь сказать мне, почему мой перевод SQL-запроса в JPQL не работает?

Заранее спасибо:)

1 Ответ

0 голосов
/ 26 июня 2018

Чтобы объединение работало в JPQL, вы должны иметь прямую зависимость в графе объектов от сущности, к которой хотите присоединиться.

Этот пример взят из самой спецификации:

SELECT c FROM Customer c JOIN c.orders o WHERE c.status = 1

, где Customer - это сущность, имеющая отношение к сущности Order через customer.orders объект списка.

Подробнее об объединениях можно прочитать в главе 4.4.5 Спецификация Java Persistence

EDIT:

Возможно, вы захотите переписать ваш запрос, чтобы он соответствовал следующему формату:

select * from agrid.um u where u.fmr = 'ABCDE' and not exists (select * from agrid.um u2 where u.name = u2.name and u.version < u2.version) ;

...