Jpa-запрос Spring Data по имени метода не работает корректно с BETWEEN для LocalDate - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть две таблицы: "DailyStatisti c" с ManyToOne для "Country".

public class DailyStatistic {
    @Id
    @GeneratedValue
    private Long id;
    @Column(columnDefinition = "DATE")
    private LocalDate date;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "country_id")
    private Country country;

///

public class Country {

            @Id
            @GeneratedValue
            private Long id;
            private String name;

Когда я звоню:

public interface DailyStatRepository extends JpaRepository<DailyStatistic, Long> {
...
List<DailyStatistic> findAllByCountryAndDateBetween(Country country, LocalDate from, LocalDate to);
...
}

Я получаю странный результат:

2020-03-29
2020-03-28
2020-03-27
2020-03-30
2020-03-29

Наборы Hibernate возражать против неправильной даты, и я получаю два разных объекта с одинаковой датой.

Пожалуйста, помогите решить проблему.

Код, где я вызываю этот метод:

public class DataProvider {

    private final ForeignDataSource foreignDataSource;
    private final DailyStatRepository repository;
    private final CountryRepository countryRepository;

    @Autowired
    public DataProvider(ForeignDataSource foreignDataSource, 
                        DailyStatRepository repository, 
                        CountryRepository countryRepository) {
        this.foreignDataSource = foreignDataSource;
        this.repository = repository;
        this.countryRepository = countryRepository;
    }

public List<DailyStatistic> getCountryStatFromToDate(Long countryId,
                                                         LocalDate from,
                                                         LocalDate to) throws NoDataException {
        Country country = countryRepository.findById(countryId).orElseThrow(NoDataException::new);
        List<DailyStatistic> dailyStatisticList = repository.findAllByCountryAndDateBetween(country, from, to);
        for (DailyStatistic ds : dailyStatisticList) {
            System.out.println(ds.getDate());
        }

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Как я понимаю, это происходит из-за разного часового пояса на стороне приложения и на стороне базы данных + перехода на летнее время, которое произошло 29 апреля. Так что, если у кого-то возникает подобная проблема - сначала проверьте разницу по тимизону.

0 голосов
/ 04 апреля 2020

Вы можете попробовать этот метод именования jpa для фильтра DailyStatistic по названию страны и дате

repository.findAllByCountryNameAndDateBetweenOrderByDateDesc(country.name,from, to);
...