Spring JPA中使用@Query注解更新时设置FROZEN_DATE为当前时间
解决方案
没问题,这事儿很容易解决!你只需要调整一下你的JPQL更新语句,在设置冻结状态的同时把frozenDate字段赋值为当前时间就行,而且这个修改只会在冻结操作中生效,完全不会干扰其他字段的更新逻辑。
修改后的Repository代码
@Repository public interface UserEntryRepository extends CrudRepository<UserEntry, String> { UserEntry findByUsername(String username); @Transactional @Modifying @Query("UPDATE UserEntry o SET o.frozen = 1, o.frozenDate = CURRENT_TIMESTAMP WHERE o.username = :username") int setFrozenForOfuser(@Param("username") String username); }
关键细节说明
CURRENT_TIMESTAMP的作用:这是JPQL标准的内置函数,所有主流JPA实现(比如Hibernate)都支持它,会自动适配数据库对应的时间函数(比如MySQL的NOW()、PostgreSQL的CURRENT_TIMESTAMP),确保获取到的是数据库服务器的当前时间。- 字段映射一致性:要确保你的
UserEntry实体类里的字段名和JPQL中的frozenDate完全对应,同时数据库表的FROZEN_DATE字段类型要和实体类字段匹配,比如用LocalDateTime类型(推荐):
@Entity @Table(name = "user_entry") public class UserEntry { // 其他字段... private Integer frozen; @Column(name = "FROZEN_DATE") private LocalDateTime frozenDate; // 对应的getter/setter方法... }
- 不影响其他更新:其他更新操作(比如调用CrudRepository自带的
save()方法修改用户其他字段)因为不会涉及frozenDate字段,所以完全不会改动这个日期的值,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Ahmet Karakaya
相关产品推荐
相关产品推荐

