我有一堂这样的课
@Entity
@Table(name = "Event")
public class Event {
@Transient
public static final long MAX_TIMESTAMP = 253402214400000L; // 9999-12-31 00:00:00
private Date creationTime;
private Date expiryTime;
private String otherValue;
public Event(int timeout, String otherValue){
this.creationTime = new Date();
this.expiryTime = (timeout == 0 ? new Date(MAX_TIMESTAMP) : new Date(creationTime.getTime() + SECONDS.toMillis(timeout)));
this.otherValue = otherValue;
}
}
我在CrudRepository中调用save()方法并保存此数据。
,我有一个ScheduledExecutorService来找出一些超时事件:
@Query("SELECT t FROM Event t WHERE t.expiryTime < CURRENT_TIMESTAMP")
List<Event> findTimeoutEvents();
此CURRENT_TIMESTAMP是数据库的时间,但不是expiryTime。这意味着我必须确保他们的时间相同。有时,应用程序和数据库不在同一台机器上,我无法确保他们的时间相同。
我可以设置数据库生成的“ expiryTime”吗?如何将参数“超时”传递给数据库。
数据库可能是postgresql或mysql。
非常感谢您。
答案 0 :(得分:0)
首先,我不确定您的代码是否有效,因为java.util.Date
的实例(如果到期时间为java.util.Date
对象)无法与int
0进行比较。
对于生成expiryTime
,是的,显然可以。查看triggers的工作方式。
我还要补充一点,如果您使用spring-boot-starter-data-jpa
,则可以用creationTime
注释来注释@CreationTimestamp
字段。但是我个人会在数据库端将默认值设置为CURRENT_TIMESTAMP()
。