Как выполнить запрос по Temporal.ВРЕМЕННАЯ МЕТКА в JPA Spring Boot во вложенных объектах?

#java #postgresql #hibernate #spring-boot #spring-data-jpa

#java #postgresql #спящий режим #spring-boot #spring-data-jpa

Вопрос:

У меня есть два вложенных объекта, подобных этому

 @Entity
@Table(name = "daily_past_prices")
public class DailyPastPrice  {

    @Id
    private String symbol;
    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinColumn(name = "symbol")
    private List<DailyPrice> prices = null;

    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public List<DailyPrice> getPrices() {
        return prices;
    }

    public void setPrices(List<DailyPrice> prices) {
        this.prices = prices;
    }
}
@Entity
public class DailyPrice {
    @Id
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;
    private String price;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

}
  

Я сохраняю дату во временном.ВРЕМЕННАЯ МЕТКА, которая означает, что дата сохраняется 1555732546000 таким образом в базе данных. Теперь мне нужно запросить значения после определенной даты. Итак, я настроил репозиторий следующим образом

 @Repository
public interface DailyPastPriceRepo extends JpaRepository<DailyPastPrice,String> {
    DailyPastPrice findBySymbolAndPricesDateAfter(String symbol, Date date);
}
  

И у меня есть метод в контроллере, подобный этому

 @GetMapping("/{symbol}/{upto}")
    private ResponseEntity<DailyPastPrice> getDayWisePastPrice(@PathVariable String symbol,@PathVariable int upto) throws ParseException {
        DailyPastPrice pastPrice = dailyPastPriceRepo.findBySymbol(symbol.toUpperCase());

        Date date = CurrentDate.getPreviousDates(upto);
        System.out.println("1 day before " date);//this gives me a date before one day if upto is 1 like this Fri Apr 19 11:50:52 IND 2019
        DailyPastPrice ppBefore1d = dailyPastPriceRepo.findBySymbolAndPricesDateAfter(symbol.toUpperCase(),date);
        if (ppBefore1d == null){
            return new ResponseEntity<>(ppBefore1d, HttpStatus.NOT_FOUND);
        }

        return new ResponseEntity<>(ppBefore1d, HttpStatus.OK);
    }
  

Но я получаю null и, следовательно NOT_FOUND . Нужно ли мне преобразовывать Fri Apr 19 11:50:52 IND 2019 в long like 1555732546000 во время запроса, но тогда это будет long тип, и тогда я не смогу запросить его like dateAfter . Итак, как я могу это сделать? Любая помощь будет оценена. Спасибо

Ответ №1:

вам нужно установить дату следующим образом:

 int milliseconds = 8645163154;
java.sql.Date d = new java.sql.Date(milliseconds);
  

если вы хотите добавить один день после или раньше, вы можете рассчитать то же самое, что и:

 int oneDay = 1000 * 60 * 60 * 24; // 86400000
  

Вы также можете использовать @Query аннотацию в своем репозитории для дальнейшего устранения вашей проблемы.