Я пытаюсь получить некоторые значения из таблицы H2 db. Запрос, который делает то, что мне нужно, таков:
SELECT cast(creationDate as date) as DATE, SUM(paymentValue) as TOTAL,fxRate
FROM payment
group by DATE
где «CreationDate», «paymentValue», «fxRate» - столбцы таблицы «оплата». CreationDate - это временная метка, поэтому мне нужно получить от нее только дату. Когда я пытаюсь написать это на Java
@Query("SELECT cast(creationDate as date) as daydate , SUM(paymentValue) as value1, fxRate as value2 FROM payment " +
"group by cast(creationDate as date)")
List<Payment> findPaymentValuePerDay ();
Получаю ошибку [Ljava.lang.Object; cannot be cast to ...entity.Payment.
Я также попытался использовать другой объект под названием GraphDto, который имеет в качестве атрибутов daydate, value1 и value2.
@Query("SELECT cast(creationDate as date) as daydate , SUM(paymentValue) as value1, fxRate as value2 FROM payment " +
"group by cast(creationDate as date)")
List<GraphDto> findPaymentValuePerDay ();
но я получаю ту же ошибку.
[Ljava.lang.Object; cannot be cast to ...entity.GraphDto.
Итак, как я могу работать с псевдонимом в JPQL ?? Мне просто нужна функция, которая возвращает имена трех разных столбцов со значениями, взятыми из существующей сущности, с использованием правильного запроса H2. Спасибо вам всем




Ваш запрос возвращает массив Object[], а не объект GraphDto, у вас есть несколько способов решить эту проблему:
Создайте конструктор, содержащий daydate, value1, value2
@Entity
public class GraphDto{
private Date daydate;
private Long value1;
private Long value2;
public GraphDto(Date daydate, Long value1, Long value2){
//...
}
//..getters and setters
}
тогда ваш запрос должен выглядеть так:
SELECT NEW com.packagename.GraphDto(cast(creationDate AS date), SUM(paymentValue), fxRate)
FROM payment
GROUP BY cast(creationDate AS date)
измените тип возвращаемого значения на:
List<Object[]> findPaymentValuePerDay ();
Затем в вашем сервисном цикле над этим объектом извлеките значения:
List<Object[]> listObject = rep.findPaymentValuePerDay();
for(Object[] obj : listObject){
Date date = (Date) obj[0];
Long value1 = (Long) obj[1];
Long value2 = (Long) obj[2];
}
другое возможное решение - List <Map <String, Object >> findPaymentValuePerDay ()
Когда вы пытаетесь выбрать
cast(creationDate as date) as daydate , SUM(paymentValue) as value1, fxRate as value2, вы пытаетесь преобразоватьObject[]вGraphDto. Неудивительно, что вы получаете ошибку. Вам необходимо проанализироватьObject[]элемент за элементом или создать подходящий конструктор вGraphDto.