Jak zwrócić obiekt przy DELETE?

0

Hej

Mam taką encję o nazwie CustomerRating, zawiera on między innymi pola: id (int), customer (Customer) oraz rating (Rating).

W repozytorium mam taką prostą metodę, która usuwa po id i zwraca usuwany obiekt:

@org.springframework.stereotype.Repository
public interface CustomerRatingRepository extends Repository<CustomerRating, Integer> {
    /* inne metody */

    CustomerRating deleteById(int id);
}

Chciałbym mieć taką samą, która usunie mi wpis po id Rating i id Customer i przede wszystkim ZWRÓCI ten usuwany obiekt (jak powyższa metoda).
Jest to w ogóle możliwe?

Ręczne zapytanie oczywiście nie działa, bo to tylko delete, a nie select


    /* inne metody */

    CustomerRating deleteById(int id);

    // blad, bo to sam delete -> wyskoczy blad "Expecting a SELECT query : `DELETE FROM........" przy uzyciu
    @Query("DELETE FROM CustomerRating cr WHERE cr.customer.id = ?1 AND cr.rating.id = ?2)
    CustomerRating deleteByCustomerIdAndRatingId(int customerId, int ratingId);

Próbowałem pokombinować z nazwą, żeby utworzyło takie zapytanie automatycznie, ale nie chce działać

7

Jaki jest cel zwracania obiektu który został usunięty?

3

W niektórych bazach np postgreSQL czy MariaDB jest coś takiego jak DELETE RETURNING, możesz po delete dopisać co chcesz, np:

DELETE FROM CustomerRating cr WHERE cr.customer.id = ?1 AND cr.rating.id = ?2 RETURNING *;

ale musiałbyś przejść na natywny SQL, no i tak jak wyżej napisano - po co ci obiekt który skasowałeś?

0

zrob findBy a potem delete

1

Hej

dobra praktyka podpowiada ze nie usuwamy rekordów tylko robimy update.. ponieważ takimi usunięciami rozwali sie indexy.
robisz select a potem update

0

Samo zawołanie findById może być problemem. Najlepiej to zrobić warstwę wyżej:

public class MyUserService {
   private final UserRepository repository;

   // konstruktor

   public User deleteById(final long id) {
      User user = repository.findById(id);
      User detached = new User();
      detached.setUserId(user.getUserId()); 
      // skopiuj inne pola

      repository.deleteById(id);

      return detached;
   }
}

Zakładam oczywiście typowy stack springowy. Można też zrobić sobie customową implementację repozytorium, która zawoła EntityManager.detach(entity) na obiekcie.

0

Spring Data JPA pod spodem robi coś takiego, możesz zrobić podobnie. W „czystym JPA” nie ma API do usuwania encji po ID, tak czy siak trzeba je pobrać. Oczywiście po usunięciu, nawet jeśli masz referencje, encja nie jest już trackowana przez EntityManagera, co może doprowadzić do błędów. Po co chcesz to robić?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.