我有一个实体,如下所示:
@Entity
public class Order {
@Id
private String orderId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_at", nullable = false)
private Date created;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated_at", nullable = false)
private Date updated;
@PrePersist
protected void onCreate() {
this.created = new Date();
this.updated = this.created;
}
@PreUpdate
protected void onUpdate() {
this.updated = new Date();
}
}
我必须找到在特定日期范围内创建或更新日期的所有订单。为此,我在存储库中定义了以下方法:
public interface OrderRepository extends PagingAndSortingRepository<Order, String>,
QuerydslPredicateExecutor<Order> {
public Page<Order> findByCreatedBetweenOrUpdatedBetween(Date startCreatedDate,
Date endCreatedDate, Date startUpdatedDate, Date endUptedDate, Pageable pageRequest);
}
我的问题是,我可以只检查
Updated_date
而不是像下面这样创建和更新日期吗?public Page<Order> findByUpdatedBetween(Date startUpdatedDate, Date endUptedDate, Pageable pageRequest);
我观察到的是
updated_date
在插入行时更新,该行的值与created_date
相同。如果仅检查updated_date提供的日期范围,是否有机会错过任何记录。 最佳答案
否,执行@PreUpdate
回调方法时,@PrePersist
回调方法并不总是运行。在持久操作(直接或级联)之前执行@PrePersist
,在数据库更新之前执行@PreUpdate
。
在JPA 2.1规范(实体的生命周期回调方法的3.5.3语义)中,这是用以下词语表示的:
为给定调用PrePersist和PreRemove回调方法
实体在各自的EntityManager持久存在并移除之前
执行该实体的操作。
...
PreUpdate和
PostUpdate回调发生在数据库更新之前和之后
分别对实体数据进行操作。