【问题标题】:JPA doesn't sort records by LocalDate and LocalTimeJPA 不按 LocalDate 和 LocalTime 对记录进行排序
【发布时间】:2020-07-13 02:20:54
【问题描述】:

我在对数据库中的记录进行排序时遇到问题。 有 10 个匹配项具有 LocalDateLocalTime 变量,并且它们没有按(最初)LocalDateLocalTime 排序。这是我从数据库中得到的:

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

我的匹配实体(由于mysql问题,类被称为Game):

@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();
}

另外,我不认为 LocalDateLocalTime 变量的列应该是这样的。

起初我以为我的 SQL Query 可能有问题,但经过一些研究后,我得出的结论是它可能没问题。 如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 为查询生成的 SQL 是什么样子的?
  • 列的生成数据类型是什么?
  • SQL 查询(在 JpaRepository 中):@Query("SELECT g FROM Game g ORDER BY g.localDate, g.localTime ASC")
  • 列的数据类型:local_date: DATETIME(6), local_time: DATETIME(6)
  • 没有 Hibernate 生成查询表单。你可以在application.properties中设置logging.level.org.hibernate.SQL=debug然后就可以看到了

标签: java mysql spring datetime spring-data-jpa


【解决方案1】:

您似乎想在两列中存储一个时间戳。大多数数据库设计人员只使用一个@LocalDateTime(MySQL 中的TIMESTAMPDATETIME)列用于该目的,因为数据类型具有日期和时间空间,而且,他们正确地ORDER

您的示例表格内容使它看起来像您的 localTime 列的日期部分设置为插入行的日期。因此,虚假日期会使您的订购错误。

如果您有充分的理由不将数据模型更改为仅使用一列,请尝试此查询。

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

它只关闭第一列中的日期和第二列中的时间。

但如果可能,请更改您的数据模型。

【讨论】:

  • 谢谢,现在可以了。我会考虑将LocalDateLocalTime 更改为LocalDateTime。再次感谢!
【解决方案2】:
@Query("SELECT g FROM Game g ORDER BY g.localDate ASC, g.localTime ASC")
List<Game> findUpcomingMatches();

试试这个,

【讨论】:

  • 这个我也试过了,还是不行。对不起,我忘了提这个
猜你喜欢
  • 2020-10-05
  • 1970-01-01
  • 2018-06-21
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多