it-swarm.com.ru

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

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

public interface ContactRepository extends JpaRepository<Contact, Integer> {

    Integer deleteByEmailAddress(String emailAddress);

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

и вот что Hibernate пытается сделать:

Hibernate: выберите contact0_.id в качестве id1_2_, contact0_.emailAddress в качестве> emailAdd2_2_, contact0_.name в качестве name3_2_ из Contact contact__ где> contact0_.emailAddress =?

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

13
Alexandru Pirvu

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

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

  1. удалить нечего, убедитесь, что запись есть в БД
  2. удаление должно быть частью транзакции. Я считаю, что операции 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)
28
ikumen

В современных версиях Spring Data JPA (> = 1.7.x) доступен вывод запросов на операции удаления, удаления и подсчета.

Spring Data: "удалить по" поддерживается?

4
Cristian J. Brito

Попробуйте переместить вызов Query delete в эксклюзивный для него класс обслуживания:

@FunctionalInterface
public interface DeleteService {

    public int deleteIfExists(Date fechaProceso);

}

и реализовать его в DeleteServiceImpl.Java, например,

0
T21