Получить все столбцы за последний месяц с помощью запроса JPA?

Мой текущий запрос подсчитывает все билеты, проданные на каждое мероприятие, и перечисляет каждое мероприятие с наибольшим количеством билетов по убыванию. Теперь проблема в том, что мне нужно получить все билеты за последний месяц, и я просто не могу получить нужный результат из JPArepo Doc. Только. Текущий запрос выглядит так:

@Query("select t.event.id, count(t.id) from Ticket t where t.event.seat = True group by t.event.id order by count(id) desc")

Я думаю, где после «Истина» и до того, как должна быть реализована группировка, но я просто не знаю, как это сделать. Я был бы очень рад, если бы кому-нибудь из вас удалось мне помочь!

Обновлено: забыл упомянуть, что текущая дата события называется просто «датой», поэтому для доступа к ней необходимо просто t.event.date.

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

Ответы 1

Ответ принят как подходящий

Измените свой запрос на что-то вроде этого:

@Query("select t.event.id, count(t.id) from Ticket t where t.event.seat = ?1 and t.event.date >= ?2  group by t.event.id order by count(t.id) desc")
List<?> getEventCount(Boolean seatTaken, Date eventDate);

Я изменил запрос, чтобы место было логическим параметром (для повторного использования, если вы хотите найти места, которые не были заняты), и добавил в параметр Date.

Затем вычислите дату месяц назад как таковую:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
Date date = cal.getTime();

И, наконец, реализуем новый метод:

List<?> results = repo.getEventCount(true, date);

Чтобы создать класс Service весной и собрать все вместе, попробуйте что-нибудь вроде:

@Service
public class TicketService {

  @Autowired
  private TicketRepository repo;

  public List<?> getTicketEventCount() {
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.MONTH, -1);
    Date date = cal.getTime();

    List<?> results = repo.getEventCount(true, date);
    return results;
  }
}

Я действительно новичок в JPA. Чтобы реализовать предложенную вами реализацию, мне нужно было бы создать класс службы, реализующий репозиторий, верно? Как именно это делается с помощью Spring?

FoolischEx 17.12.2018 19:41

Ознакомьтесь с документацией Spring JPA. Это длинно (слишком много, чтобы публиковать здесь), но хороший исходный материал для начала docs.spring.io/spring-data/jpa/docs/2.1.3.RELEASE/reference/‌…

locus2k 17.12.2018 19:50

Я действительно сделал! Моя проблема заключается в том, что все примеры находятся в интерфейсе репозитория. Мой вопрос: нужно ли реализовывать новую службу только для этих трех строк кода? Или, может быть, есть способ написать все это в одном запросе без необходимости в этих трех строках календаря?

FoolischEx 17.12.2018 19:56

Вам нужно будет вычислить часть «месяц назад», прежде чем использовать ее в своем запросе, другой альтернативой является запись хранимой процедуры в вашей базе данных, которая может это сделать. См. Мое редактирование, чтобы показать услугу.

locus2k 17.12.2018 20:12

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