Преобразование SQL-запросов в критерии и прогнозы гибернации - PullRequest
0 голосов
/ 21 мая 2018

У меня есть запрос из SQL:

select e.* 
from terminal_remote_deployment e
where id = (select top 1 e1.id
            from terminal_remote_deployment e1
            where e1.Terminal_info_id = e.Terminal_info_id
            order by e1.version desc
           );

Я пытаюсь написать его на HQL следующим образом:

final StringBuilder hql = new StringBuilder();
            hql.append(" from TerminalRemoteDeployment e");
            hql.append(" where e.id = (Select TOP 1 e1.id from TerminalRemoteDeployment e1 where e1.terminalInfo.id = e.terminalInfo.id order by e1.version desc)");

            Query query = getEntityManager().createQuery(hql.toString());
            resultList = (List<TerminalRemoteDeployment>) query.getResultList();

Я получаю ошибки при таком подходе.пожалуйста, помогите мне написать критерии в спящем режиме, так как я новичок в этом.

Ответы [ 4 ]

0 голосов
/ 30 мая 2018

Вы пытаетесь это сделать?

select e.* 
from  terminal_remote_deployment e1 JOIN 
      (select e.id, max(e.version)
      from terminal_remote_deployment e group by e.id) as a
on e.id = a.id
0 голосов
/ 21 мая 2018

Как уже было сказано в комментарии, используйте setMaxResult () метод вместо ключевого слова TOP, поскольку он не поддерживается HQL.

Также в sub-select, который вы используете id без псевдонима сущности.

Измените его на Select e1.id from TerminalRemoteDeployment e1

0 голосов
/ 23 мая 2018

Прежде всего, я не специалист по Hibernate.Но ваш первый запрос, если специфичен для SQL Server:

select e.* 
from terminal_remote_deployment e
where id = (select top 1 e1.id
            from terminal_remote_deployment e1
            where e1.Terminal_info_id = e.Terminal_info_id
            order by e1.version desc
           );

, я бы переписал его, используя ROW_NUMBER (поддерживается MySQL 8.0 / MariaDB / SQL Server / PostgreSQL / Oracle / H2 / Derby / ...) итогда я бы использовал именованный запрос:

SELECT *
FROM(SELECT e.*,
     ROW_NUMBER() OVER(PARTITION BY Terminal_info_id ORDER BY version desc) AS rn
     FROM terminal_remote_deployment e) sub
WHERE rn = 1;
0 голосов
/ 21 мая 2018

Где предложение во внутреннем подзапросе второго Приложения.Это должно быть Terminal_Info_id вместо TerminalInfo.id .

final StringBuilder hql = new StringBuilder();
        hql.append(" from TerminalRemoteDeployment e");
        hql.append(" where e.id = (Select TOP 1 id from TerminalRemoteDeployment e1 where e1.terminal_Info_id = e.terminal_Info_id order by e1.version desc)");

        Query query = getEntityManager().createQuery(hql.toString());
        resultList = (List<TerminalRemoteDeployment>) query.getResultList();
...