我正在嘗試在 Spring Boot 中使用 JPARepository 來洗掉小于某個日期的記錄,對于給定的用戶 ID
應該是這樣的 Delete * from [table] where expiration_date < [date] and userid = [userid]
我想我應該能夠使用自動生成的方法之一
int deleteByExpiryDateBeforeAndUser(Date date, User user);
但這是生成選擇而不是洗掉。我究竟做錯了什么?
更新
物體類
@Getter
@Setter
@ToString
@Entity(name = "refresh_token")
public class RefreshToken {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@OneToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
private User user;
@Column(nullable = false, unique = true)
private String token;
@Column(nullable = false)
private Date expiryDate;
public RefreshToken() {
}
}
存盤庫類
@Repository
public interface RefreshTokenRepository extends JpaRepository<RefreshToken, Long> {
Optional<RefreshToken> findByToken(String token);
@Modifying
void deleteByUserIdAndExpiryDateBefore(Long userId, Date expiryDate);
int deleteByUser(User user);
}
這是我如何稱呼它
@Transactional
public void deleteExpiredTokens(User user) {
refreshTokenRepository.deleteByUserIdAndExpiryDateBefore(user.getId(), new Date());
}
uj5u.com熱心網友回復:
您會看到一個 select 陳述句,因為 Spring Data 首先按條件加載物體。
然后,一旦物體成為“托管”,Spring Data 就會為找到的每個物體發出洗掉查詢。
如果您想避免冗余的 SQL 查詢 - 您必須考慮@Query注釋。
然后您的代碼將如下所示:
@Repository
public interface RefreshTokenRepository extends JpaRepository<RefreshToken, Long> {
// ...
@Query(value = "DELETE FROM refresh_token WHERE user_id =:userId AND expiry_date < :expiryDate", nativeQuery = true)
@Modifying
void deleteByUserIdAndExpiryDateBefore(Long userId, Date expiryDate);
//...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/341279.html
標籤:PostgreSQL 弹簧靴 jpa 弹簧数据-jpa
