2015-12-16 2 views
0

У меня есть этот запрос:Как сделать заказ на вычисляемый столбец в новом DTO запросе

em.createQuery("select new SomeDto(some.name, " + 
"(select max(other.weight) from Other other where other.someId = some.id) as otherWeight" + 
") from Some some order by otherWeight") 
.getResultList(); 

который не работает, потому что спящий режим игнорирует as otherWeight и просто генерирует as col_1_0_ вместо этого.

Есть ли способ с таким видом запроса select new dto, чтобы получить псевдонимы для столбцов? Если нет: как я могу сделать такой запрос (отобразить результат запроса в конструктор DTO)?

ответ

0

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

select new SomeDto(some.name, max(other.weight)) 
from Other other right outer join other.some some 
group by some.id, some.name 
order by max(other.weight) 

Вам нужно ввести много-к-одному (или один-к-одному) ассоциацию от Other к Some, если вы дон У меня уже есть.

+0

это работает, если для каждого 'Some' всегда есть' Other', но в случае, если это необязательно, я бы исключил эти результаты (внутреннее соединение) правильно? – NoUsername

+0

@NoUsername Верно, пожалуйста, см. Мой обновленный ответ. –

+0

Возможно, вы правы. Моя первоначальная цель заключалась в том, чтобы каким-то образом использовать псевдоним в предложении order by, чтобы сделать все это более читаемым (предположим, что вместо 'max (other.weight)' есть еще более сложное выражение), однако, похоже, что это что-то нужно больше в «чистом sql», если вы много раз пишете запросы. При построении таких jpql-запросов такие выражения могут быть помещены в переменные и объединены таким образом, чтобы все еще сохранять их читабельными. Поэтому я думаю, что на самом деле нет решения для того, что я хотел, потому что это не то, что нужно «нужно». – NoUsername