Запрос на присоединение SQL к JPQL - PullRequest
0 голосов
/ 25 октября 2018

Надеюсь, кто-то здесь может мне помочь.

Я нашел запрос, который хочу использовать на sqlDev:

SELECT t1.*
  FROM table1 t1 INNER JOIN
(
  SELECT ev.ID_AGENCE, MAX(ev.DATE_CREATION) DATE_CREATION
    FROM table1 ev
    WHERE ev.ID_AGENCE IN (326,324)
    GROUP BY ev.ID_AGENCE
) t2 ON t1.ID_AGENCE = t2.ID_AGENCE
    AND t1.DATE_CREATION = t2.DATE_CREATION
    order by t1.id_agence;

, чтобы сохранить только самую близкую дату в списке и только однудля идентификатора (324 и 326 здесь в моем примере):

324 22/10/18
324 21/10/18
324 20/10/18
326 10/08/18
326 09/08/18
326 07/08/18
326 06/08/18
326 05/08/18
326 04/08/18
326 03/08/18
326 02/08/18
326 01/08/18

Я пытался перевести на JPA (JPQL):

final String requete = "SELECT e FROM ClasseJava JOIN " + 
                "( " + 
                    "SELECT f.id, MAX(f.dateCreation) dateCreation " + 
                    "FROM ClasseJava f " + 
                    "WHERE f.idAgence IN (326,324) " + 
                    "GROUP BY f.idAgence " + 
                ") "                        + 
                "t ON e.idAgence = t.idAgence " + 
                "AND e.dateCreation = t.dateCreation " + 
                "GROUP BY idAgence ";

final TypedQuery<ClasseJava> query = entityManager.createQuery(requete, ClasseJava.class);
query.setParameter("listIdAgence", listIdAgence);
return query.getResultList();

И я получаю следующую ошибку: «Путь ассоциации соединения не является допустимым выражением.»

У кого-нибудь есть идеи по устранению проблемы?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Я сделал это, удалив предложение Join.

вот так:

 final String requete = "SELECT e FROM classeJava e, " + 
"( " + 
"SELECT f.idAgence, MAX(f.dateCreation) dateCreation " + 
"FROM classeJava f " + 
"WHERE f.idAgence IN :listIdAgence " + 
"GROUP BY f.idAgence " + 
") " + 
"t WHERE e.idAgence = t.idAgence " + 
"AND e.dateCreation = t.dateCreation " + 
"ORDER BY e.idAgence ";

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 25 октября 2018

Согласно этому ответу невозможно использовать подзапрос в предложении соединения.То же самое можно сказать о Criteria API и HQL

Может быть, вы можете переписать свой запрос, используя предложение HAVING или переместив подзапрос в предложение WHERE?

...