Репозиторий JPA: Невозможно связать параметр для часового пояса - PullRequest
2 голосов
/ 04 мая 2020

У меня есть следующий код в репозитории JPA, и он работает.

  @Query(
      value =
          "SELECT EXTRACT(HOUR FROM STO.createddate\\:\\:timestamptz at time zone 'Asia/Seoul') AS hour,\n"
              + "        COUNT(STO.id) AS count, SUM(STO.grandtotalprice) AS sum, AVG(STO.grandtotalprice) AS average\n"
              + "FROM store.storeorder AS STO\n"
              + "WHERE STO.store_id=?1 AND STO.createddate >= ?2 AND STO.createddate < ?3 AND STO.orderstatus IN ('CLOSED')\n"
              + "GROUP BY EXTRACT(HOUR FROM STO.createddate\\:\\:timestamptz at time zone 'Asia/Seoul') \n"
              + "ORDER BY hour ASC;",
      nativeQuery = true)
  List<ReportHourly> hourlyReport(
      UUID storeId, LocalDateTime from, LocalDateTime to);

Однако, когда я пытаюсь ввести часовой пояс в качестве параметра, как показано ниже, он не может сказать:

org.postgresql.util.PSQLException: ERROR: column "createddate" must appear in the GROUP BY clause or be used in an aggregate function
  @Query(
      value =
          "SELECT EXTRACT(HOUR FROM STO.createddate\\:\\:timestamptz at time zone ?4) AS hour,\n"
              + "        COUNT(STO.id) AS count, SUM(STO.grandtotalprice) AS sum, AVG(STO.grandtotalprice) AS average\n"
              + "FROM store.storeorder AS STO\n"
              + "WHERE STO.store_id=?1 AND STO.createddate >= ?2 AND STO.createddate < ?3 AND STO.orderstatus IN ('CLOSED')\n"
              + "GROUP BY EXTRACT(HOUR FROM STO.createddate\\:\\:timestamptz at time zone ?4) \n"
              + "ORDER BY hour ASC;",
      nativeQuery = true)
  List<ReportHourly> hourlyReport(
      UUID storeId, LocalDateTime from, LocalDateTime to, String timeZone);

Я не уверен, почему параметризация не работает для этого случая.

1 Ответ

0 голосов
/ 04 мая 2020

Я думаю, что проблема в том, что JDB C на самом деле не знает об индексированных аргументах связывания, он знает только о ? для привязки.

Это означает, что два вхождения для ?4 get переводится в два разных параметра связывания, и поэтому Postgres видит выражение в предложении select, которое не является частью GROUP BY и не является агрегатной функцией.

Поскольку по построению эти два на самом деле одинаковы, вы должны быть Точная упаковка выражения для часа в MAX(...) или любой другой агрегатной функции, которая возвращает значение аргумента применительно к одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...