首页 > 解决方案 > 我在整个项目中使用了 LocalDate,现在我需要 LocalDateTime 来实现功能,该怎么办?

问题描述

我正在创建一个几乎完成的博客。LocalDate 一切正常,直到管理员创建帖子时,“创建日期”和“修改日期”被添加到保存在 MySQL 数据库中的帖子中。每次用户更新帖子时,“修改”日期都会更改。

我想添加的最后一个功能是显示管理员按降序发布的最后 3 个帖子。现在问题来了:如果管理员在同一天一个接一个地添加 3 个帖子,则 LocalDate 无法对它们进行排序,因为它无法区分它们,因为它们都有相同的标准日期,并且时间不存在。

我尝试修改我的 JPA 查询以及每个实体字段和方法以使用 LocalDateTime 而不是 LocalDate,但随后发生了这种情况:

@Repository
public interface PostRepository extends CrudRepository<Post, Long> {
    List<Post> findAllByCreatedAtBetween(LocalDateTime start, LocalDateTime end);
    List<Post> findAllByOrderByCreatedAtDesc();
}
java.lang.IllegalArgumentException: Parameter value [2020-09-01T12:27:19.341] did not match expected type [java.time.LocalDate (n/a)]

我在某处读到“中间”不适用于 LocalDateTime,现在我的整个项目都坏了。

我很困惑,也很恼火,我这么晚才发现 LocalDate 在灵活性方面是错误的选择。请帮助我了解我现在有哪些选项可以使该功能正常工作。任何帮助将不胜感激!

邮政类:

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long id;
   
    private LocalDateTime createdAt;
   
    private LocalDateTime modifiedAt;

    @NotBlank(message = "Post Title is required")
    private String title;

    @Basic(fetch = FetchType.LAZY)
    private String image;

    @Column(length = 65535,columnDefinition="Text")
    @NotBlank(message = "Post Content is required")
    private String content;

    @OneToMany(cascade = CascadeType.ALL)
    private List<Comment> comments = new ArrayList<>();

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "POST_TAG", joinColumns = {@JoinColumn(name = "post_id")},
            inverseJoinColumns = {@JoinColumn(name = "tag_id")})
    private Set<Tag> tags = new HashSet<>();

对于任何在同一问题上苦苦挣扎的人,这次更容易,而不是进行破坏整个代码的修改以仅按 ID 对实体进行排序。但是下一次从一开始就选择一个为您提供更多灵活性的类(如 LocalDateTime),因为您永远不知道接下来需要实现什么。

标签: javaspringspring-boothibernatejpa

解决方案


  1. 正如评论中所建议的,您可以按记录 ID 对帖子进行排序,记住每个新帖子都会增加记录 ID。

  2. 请注意,您使用已弃用的休眠方言。正如它在对该方言的评论中所说:

请改用“hibernate.dialect.storage_engine=innodb”环境变量或 JVM 系统属性。

使用这种方言还会导致日期/时间数据类型的映射问题。例如看这个


推荐阅读