首页 > 解决方案 > 使用 Spring Boot 重新创建 Twitter 涉及的问题

问题描述

又是我

关于 JpaRepository 的一个快速问题

我正在使用 Spring Boot 和 Hibernate 开发 Twitter 的镜像项目。我已经完成了 Twitter 的大部分功能的创建——发布、转发、评论等。现在我正在努力使这个网络应用程序更加用户友好,特别是关于应用程序从数据库加载帖子的方式。

目前,我的应用程序是这样工作的:每次用户登录时,系统都会从他/她的“关注列表”中加载所有帖子,这不好,因为如果这个用户关注数百人,可能会有数万个帖子同时加载——这不仅对服务器构成了巨大的负担,而且还耗费了用户的耐心。

所以我想切换到另一种加载帖子的方式。目前,我有这个想法:

每次用户登录系统时,都会有一个“lastLoginTime”,用@LastModifiedTime. 每次有人发布内容时,都会创建一个“postTime”,使用@CreatedTime. 每次用户登录系统时,服务器将加载上次登录时间前不超过 24 小时发布的帖子。

更加具体。假设我在上午 8:00 登录系统。该系统应该加载昨天上午 8:00 之后发布的帖子。

因为我使用的是 JpaRepository。我打算使用@Query 来注释该方法。但我只是想不出一种可能的方法来编写一个好的 JPQL 来实现这个目标。有人可以帮我吗?我已经完成了 lastLoginTime 和 postTime 的创建——顺便说一句。

提前致谢

'

标签: hibernatespring-mvcspring-bootspring-data-jpajpql

解决方案


遗憾的是,Hibernate 没有很多日期函数。因此,您需要尝试调用数据库的本机 DATE 函数来执行此操作。另一种选择是始终保存,在原始发布日期一天的发布日期信息的新列中。

使用新列,您可以:

SELECT post FROM Post post 
WHERE post.postTimeToLoad >= 
    (SELECT user.lastLoginTime FROM User user WHERE user.id = :idLoggerUser)

如果您可以使用数据库中的本机函数,请参阅使用DATE_SUB函数的 MySql 示例:

SELECT post FROM Post post 
WHERE DATE(DATE_SUB(post.postTime, INTERVAL 1 DAY)) >= 
    (SELECT user.lastLoginTime FROM User user WHERE user.id = :idLoggerUser)

推荐阅读