Я попытался сделать другой метод в Spring Data JPA Repository, который должен добавить указанные часы в метку времени.

public interface ActivationCodeRepository extends CrudRepository<ActivationCode, Long> {

  @Query(value = "select a from ActivationCode a where a.creationTime + INTERVAL '1 hour' * :hoursAgo  <=  CURRENT_TIMESTAMP and a.type = :type and a.account = account")
  List<ActivationCode> getAllAddedAtLeastXHoursAgo(@Param("account") Account account, @Param("type") int type, @Param("hoursAgo") int hoursAgo);


}

Это не работает из-за этого:

  • ИНТЕРВАЛ '1 час' *: часы назад

В яблочко:

'1 час'

IDE подчеркивает и дает эту ошибку:

<'expression'>, <'operator'>, ожидается GROUP, HAVING или ORDER.

Я попытался сделать некоторые исследования и найти, как именно я должен добавить данные часы в creationTime, но не нашел нигде.

-1
Warmix 21 Авг 2018 в 00:16

3 ответа

Лучший ответ

Как a_horse_with_no_name сказал, что мне нужно использовать собственный запрос, чтобы сделать что-то подобное, поэтому я изменил свой метод для:

  @Query(value = "select * from activation_codes a where a.type = :type and a.id_account = :id_account and a.creation_time <= NOW() - :hoursAgo * INTERVAL '1 hour'", nativeQuery = true)
  List<ActivationCode> getAllAddedAtLeastXHoursAgo(@Param("id_account") int id_account, @Param("type") int type, @Param("hoursAgo") int hoursAgo);

И это работает правильно. Спасибо за помощь.

1
Warmix 21 Авг 2018 в 17:40

Я не верю, что PostgreSQL позволяет передавать операторы INTERVAL, требуя жестко запрограммированной строки с вводом в стиле interval '1 day'; однако вы можете достичь этого, приведя строку к интервалу.

Попробуйте изменить SQL-запрос в вашем коде на:

select a from ActivationCode a where a.creationTime + (:hoursAgo||' hour')::interval <=  CURRENT_TIMESTAMP and a.type = :type and a.account = account

Кроме того, я только что нашел этот предыдущий ответ StackOverflow , это стоит попробовать, но может иметь ту же проблему (при условии, что это связано с анализатором запросов Spring Data JPA):

select a from ActivationCode a where a.creationTime + :hoursAgo * INTERVAL '1 hour' <=  CURRENT_TIMESTAMP and a.type = :type and a.account = account
1
Timshel 21 Авг 2018 в 01:39

Если кому-то интересно после всего этого времени, я сделал это самым отвратительным способом. Но это сработало.

@Query Аннотация как ниже;

@Query("SELECT q FROM QueryStatusDao q WHERE q.jobStatus='Submit' AND q.submitTime < now() - :interval")
List<QueryStatusDao> getRunnableParkedQueries(@Param("interval")String interval);

И я называю этот метод следующим образом;

queryStatusRepository.getRunnableParkedQueries("INTERVAL '1 hour'");

Если я найду какой-нибудь другой не подлый способ сделать это, я обновлю.

0
Tharaka Devinda 15 Май 2019 в 10:24
51938593