Решение ошибки: DML операция delete не поддерживается в JpaRepository
Быстрый ответ
Для успешного выполнения DML-операции удаления с помощью JpaRepository, необходимо применить аннотации @Modifying и @Transactional следующим образом:
@Modifying
@Transactional
@Query("DELETE FROM EntityName e WHERE e.attribute = ?1")
void performDeletion(String value);
Аннотация @Modifying информирует Spring приложение о намерении выполнить операции обновления или удаления, в то время как @Transactional контролирует транзакцию, обеспечивая сохранение внесённых изменений в базе данных.
Понимание ключевых принципов и подходов к проектированию в Spring Data JPA играет решающую роль в успешной реализации пользовательских DML-операций, включая delete. Аннотация @Modifying указывает на изменение данных при выполнении определённого запроса, отличая его от запросов на выборку. Типом возвращаемого значения таких методов как правило является void или int/Integer, где числовое значение показывает количество затронутых записей.
Для правильного составления запросов на удаление сущностей по определённым условиям, примените в вашем интерфейсе JpaRepository комбинацию аннотаций @Modifying, @Query и @Transactional. Параметры запроса задавайте с использованием @Param, чтобы чётко связать их с плейсхолдерами в запросе.

Избегаем семантики транзакций
Рекомендуется применять @Transactional, аннотируя методы сервиса, а не интерфейсы репозитория. Это обеспечивает сохранение целостности транзакции на уровне слоя сервисов и предоставляет четкую декомпозицию ответственности в приложении. Вот пример такого применения:
public interface MyService {
void deleteSomeData(String value);
}
@Service
public class MyServiceImpl implements MyService {
private final MyRepository myRepository;
@Autowired
public MyServiceImpl(MyRepository myRepository) {
this.myRepository = myRepository;
}
@Override
@Transactional
public void deleteSomeData(String value) {
myRepository.performDeletion(value);
}
}
EntityManager против JpaRepository: нерешённые вопросы
Для более сложных DML-операций EntityManager обладает большим функционалом, чем JpaRepository. При выполнении сложной операции delete предпочтительнее использовать entityManager.createQuery().executeUpdate(), который дает возможность для детальной настройки транзакции и выполнения запроса.
Ошибки, заслуживающие внимания
- Не забудьте, что использование
@Transactionalрекомендовано только для классов сервисов, не для интерфейсов репозитория. - Будьте внимательны при импорте аннотаций
@Modifying,@Transactionalи@Query. - Понимайте принципы распределения транзакций. Операции внутри методов с аннотацией
@Transactionalдолжны рассматриваться как единый блок логической работы.
Визуализация
Допустим, вы пользуетесь измельчителем древесины для уничтожения больших веток.
Попытка выполнить DML с помощью JpaRepository:
jpaRepository.delete(entity); // JpaRepository не справится с этим сам
Для DML-операций типа delete потребуются специализированные инструменты:
@Modifying
@Query("DELETE FROM Entity e WHERE e.id = :id")
void performDeletion(@Param("id") Long id); // Эффективное удаление специализированным запросом
Продолжая аналогию, метод будет работать подобно точечному лучу Человека-Муравья, разработанному специально для выполнения DML-задач в Spring Data JPA.
Динамические условия, динамические ответы
Для динамического определения условий удаления сущностей, Criteria API или Querydsl предлагают продвинутые возможности создания SQL-запросов, что особенно полезно при формировании фильтров на основе переменных критериев.
Готовность к распространённым ошибкам
Важно уделить внимание таким традиционным ошибкам, как:
- Неверное использование индексации JPQL-запросов вроде
?1,?2и т.д. - Пропуск аннотации
@Paramпри использовании в параметрах методов, что ведёт к неполадкам с привязкой параметров. - Недооценка обязательности использования
@Modifyingпри операциях обновления или удаления, что вызывает ошибки, связанные с неподдерживаемыми операциями.
Полезные материалы
- Spring Data JPA :: Spring Data JPA — официальная документация по использованию
@Modifyingв Spring Data JPA. - java – Spring – No EntityManager with actual transaction available for current thread – cannot reliably process 'persist' call – Stack Overflow — обзор типичных проблем связанных с
@Modifyingи@Transactionalи способы их решения. - Transactional (Spring Framework 6.1.3 API) — официальный JavaDoc для
@Transactional, содержащий детальное описание практического использования. - Guide to @Modifying in Spring Data JPA — пошаговое описание использования аннотации
@Modifyingв Spring Data JPA. - Spring Data JPA Transactions and Isolation Tutorial — объяснение настроек транзакций и уровней изоляции в Spring Data JPA.
- Advanced Spring Data JPA – Specifications and Querydsl — глубокое погружение в Specifications и Querydsl для создания сложных запросов в Spring Data JPA.
- 39 The Java Persistence Query Language (Release 7) — всестороннее руководство по языку JPQL, широко применяемому в пользовательских методах репозитория в Spring Data JPA.


