Получить результат запроса в виде настраиваемого списка объектов

Я хочу реализовать 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?

Вы хотите выполнить собственный запрос и сопоставить результат с java-объектом?

Denis Zavedeev 06.11.2018 22:13

Да - это тот результат, который я хотел бы получить.

Peter Penzov 06.11.2018 22:14

Пожалуйста, ознакомьтесь со статьей это. В частности раздел DTO projections using a ConstructorResult

Denis Zavedeev 06.11.2018 22:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
498
1

Ответы 1

Самый простой способ - добавить @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();
}

Другие вопросы по теме