Spring данные jpa deleteBy запрос не работает

Я пытаюсь создать пользовательский метод метода метода deleteBy в моем репозитории. Кажется, что вместо удаления, hibernate делает оператор select.

public interface ContactRepository extends JpaRepository<Contact, Integer> {

    Integer deleteByEmailAddress(String emailAddress);

    //and this one works
    Contact findContactByName(String name);
}

и вот что делает Hibernate:

Спящий режим: выберите contact0_.id как id1_2_, contact0_.emailAddress as > emailAdd2_2_, contact0_.name как имя3_2_ из Contact contact0_ где > contact0_.emailAddress =?

Что мне не хватает? Должен ли я сделать специальную конфигурацию, чтобы сделать работу удаления?

Ответ 1

Неужели удаление не работает или не работает так, как вы ожидали? Как правило, управление объектом должно быть до его удаления, поэтому поставщик JPA (спящий режим в вашем случае) будет загружать (запрос, который вы видите) сначала, а затем выдает удаление.

Если вы видите только запрос, но не имеете соответствующего удаления, то возможны следующие варианты:

  • там ничего не удалить, убедитесь, что запись находится в db
  • удаление должно быть частью транзакции. Я полагаю, что операторы CRUD данных Spring являются транзакционными по умолчанию, если не просто удостовериться, что все, что вызывает deleteByEmailAddress, является транзакционным

Примечание. Вы можете избежать выбора при удалении объекта с использованием модифицирующего запроса delete, пример ниже:

// NOTE: you have return void
@Modifying
@Transactional
@Query(value="delete from Contact c where c.emailAddress = ?1")
void deleteByEmailAddress(String emailAddress)