Я хочу реализовать SQL-запрос для гистограммы, которая показывает объемы в день за последние 10 дней. Например, у меня есть такая структура таблицы:
CREATE TABLE `payment_transactions` (
`id` int(11) NOT NULL,
`amount` int(11) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
);
Я получаю этот примерный результат (сгруппированный по дням):
Date | Amount| Number of transactions per day |
11-11-2018 | 30 | 3 |
11-12-2018 | 230 | 13 |
Запрос JPA:
public List<DashboardDTO> findAll() {
String hql = "SELECT date(created_at) AS cdate, sum(amount) AS amount, count(id) AS nooftransaction "
+ "FROM payment_transactions WHERE date(created_at)>=date(now()- interval 10 DAY) "
+ "AND date(created_at)<date(now()) GROUP BY date(created_at)";
TypedQuery<DashboardDTO> query = entityManager.createQuery(hql, Merchants.class);
List<DashboardDTO> data = query.getResultList();
return data;
}
Объект Java:
public class DashboardDTO {
private Date date;
private int amount;
private int number_of_transactions;
public DashboardDTO(Date date, int amount, int number_of_transactions) {
this.date = date;
this.amount = amount;
this.number_of_transactions = number_of_transactions;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public int getNumber_of_transactions() {
return number_of_transactions;
}
public void setNumber_of_transactions(int number_of_transactions) {
this.number_of_transactions = number_of_transactions;
}
}
Как правильно реализовать запрос? Хотелось бы получить результат в виде List<DashboardDTO> без использования Entity?
Да - это тот результат, который я хотел бы получить.
Пожалуйста, ознакомьтесь со статьей это. В частности раздел DTO projections using a ConstructorResult




Самый простой способ - добавить @Entity, @Id к вашему DashboardDTO и сделать так, чтобы ваше родное имя псевдонима sql соответствовало имени свойства DTO.
@Entity
public class DashboardDTO {
@Id
private Date cdate;
private int amount;
private int numberOfTransactions;
...
}
public List<DashboardDTO> findAll() {
String hql = "SELECT ... AS cdate, ... AS amount, ... AS number_of_transactions FROM ...";
return entityManager.createNativeQuery(hql, DashboardDTO.class).getResultList();
}
Вы хотите выполнить собственный запрос и сопоставить результат с java-объектом?