有一个实体:
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Keys {
private @Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
)
String id;
private @Lob
java.security.KeyPair keyPair;
private Calendar expirationDate;
public Keys(java.security.KeyPair keyPair, Calendar expirationDate) {
this.keyPair = keyPair;
this.expirationDate = expirationDate;
}
}
和存储库:
public interface KeysRepository extends JpaRepository<Keys, String> {
}
必须执行删除所有早于过去时间的Keys操作expirationDate。显然,这个任务对应的是请求DELETE FROM Keys WHERE expirationDate < :1。但是在向接口添加方法时deleteAllByExpirationDateBefore(Calendar date),deleteKeysByExpirationDateBefore(Calendar date)会deleteByExpirationDateBefore(Calendar date)记录请求:
Hibernate:
select
keys0_.id as id1_0_,
keys0_.expiration_date as expirati2_0_,
keys0_.key_pair as key_pair3_0_
from
keys keys0_
where
keys0_.expiration_date<?
Hibernate:
delete
from
keys
where
id=?
也就是说,DROP FROM Keys WHERE expiration_date < ?首先选择所有满足的,而不是简单的,然后将它们逐个删除(delete from keys where id=?)。
问题:如何使它在调用方法时执行请求delete from keys where expiration_date < ??不使用注解@Query。
自动生成的方法
deleteBy*总是先读取单独请求中的数据,然后一个一个地删除。这样做的原因在文档中进行了描述,即这样做是为了可以调用处理程序,
@PreRemove并且这种删除方法的行为与delete.所以使用
@Query+@Modifying是必不可少的(在这种情况下方法的名称无关紧要):