Кажется, что нет способа сделать это в JPQL, поэтому я должен был обойти.По сути, я использовал неявное преобразование SQL-сервера из varchar
в datetimeoffset
.Так что это может не работать в других СУБД.Я изменил интерфейс хранилища следующим образом:
@NoRepositoryBean
public interface SoftDeleteCrudRepository<T extends SoftDelete, ID extends Long> extends CrudRepository<T, ID> {
//...
@Query("update #{#entityName} e set e.delDT=?2 where e.delDT is null and e.id=?1")
@Modifying
void deleteById(Long id, String datetimeStr);
//...
}
Затем используйте вот так:
authRepository.deleteById(entity.getSeq(), OffsetDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS XXX")));
Я также изменил delDT
тип поля с OffsetDatetime
на String
от сущностиучебный класс.В противном случае возникнет исключение, подобное этому.
org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [2019-04-10 11:53:13.189 +09:00] did not match expected type [java.time.OffsetDateTime (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [2019-04-10 11:53:13.189 +09:00] did not match expected type [java.time.OffsetDateTime (n/a)]