JPA не сортирует записи по LocalDate и LocalTime - PullRequest
1 голос
/ 01 апреля 2020

У меня проблема с сортировкой записей из моей базы данных. Существует 10 совпадений с переменными LocalDate и LocalTime, и они не сортируются (сначала) LocalDate и LocalTime. Это то, что я получаю из базы данных:

2020-04-04 13:00:00
2020-04-04 15:00:00
2020-04-04 16:00:00
2020-04-04 19:00:00
2020-04-04 20:00:00
2020-04-04 16:00:00
2020-04-04 22:00:00
2020-04-04 18:00:00
2020-04-04 23:00:00
2020-04-04 23:30:00

, но должно быть:

2020-04-04 13:00:00
2020-04-04 15:00:00
2020-04-04 16:00:00
2020-04-04 16:00:00
2020-04-04 18:00:00
2020-04-04 19:00:00
2020-04-04 20:00:00
2020-04-04 22:00:00
2020-04-04 23:00:00
2020-04-04 23:30:00

Мой объект соответствия (класс называется Game из-за проблем mysql):

@Data
@Entity
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne
    private Team teamBlue;

    @OneToOne
    private Team teamRed;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate localDate;

    @DateTimeFormat(pattern = "HH:mm")
    private LocalTime localTime;

}

JpaRepository:

@Repository
public interface GameRepository extends JpaRepository<Game, Long> {

    @Query("SELECT g FROM Game g ORDER BY g.localDate, g.localTime ASC")
    List<Game> findUpcomingMatches();
}

Также я не думаю, что именно так должны выглядеть столбцы для LocalDate и LocalTime переменных.

enter image description here

Сначала я подумал, что может быть проблема с моим SQL Запросом, но после некоторого исследования я пришел к выводу, что все может быть в порядке. Если кто-нибудь может мне помочь, я был бы очень признателен.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Похоже, вы хотите сохранить одну временную метку в двух столбцах. Большинство разработчиков баз данных для этой цели используют только один столбец @LocalDateTime (TIMESTAMP или DATETIME в MySQL), поскольку в типе данных есть место и для даты, и для времени, и, что ж, они ORDER правильно.

Содержимое вашего примера таблицы выглядит так, как будто часть даты вашего столбца localTime установлена ​​на дату, в которую была вставлена ​​строка. Так что фиктивная дата делает ваш заказ неправильным.

Если у вас есть веская причина не менять модель данных, чтобы использовать только один столбец, попробуйте этот запрос.

@Query("SELECT g FROM Game g ORDER BY DATE(g.localDate) ASC, TIME(g.localTime) ASC")
List<Game> findUpcomingMatches();

Он отключает только дата в первом столбце и только время во втором столбце.

Но измените модель данных, если можете.

0 голосов
/ 01 апреля 2020
@Query("SELECT g FROM Game g ORDER BY g.localDate ASC, g.localTime ASC")
List<Game> findUpcomingMatches();

Попробуйте,

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