Пользовательский метод удаления в JpaRepository - PullRequest
0 голосов
/ 08 ноября 2018

Я хотел бы знать, есть ли способ переопределить метод delete для некоторых из моих JpaRepository без необходимости переопределять остальные методы.

В настоящее время у меня есть что-то вроде

public interface UserRepo extends JpaRepository<User, Long>
{
    findUserById(long id);

    findUserByEmail(String email);

    // etc...
}

И я бы хотел переопределить метод delete(T Entity) в CrudRepository. Для этого я попытался реализовать UserRepo, но затем мне пришлось реализовать все findByX, и я ничего не нашел, как правильно это сделать.

Есть ли какая-нибудь аннотация для добавления к функции в классе Entity, чтобы она запускалась при вызове UserRepo.delete(myUser)?

Заранее спасибо!

Ответы [ 7 ]

0 голосов
/ 08 ноября 2018

В дополнение к сообщению Рахилы Аслам:

В документации Spring-data есть пример того, как вы можете переопределить стандартные методы репозитория, например:

interface CustomizedSave<T> {
  <S extends T> S save(S entity);
}

class CustomizedSaveImpl<T> implements CustomizedSave<T> {

  public <S extends T> S save(S entity) {
    // Your custom implementation
  }
}

interface UserRepository extends CrudRepository<User, Long>, CustomizedSave<User> {
}

Вы можете прочитать об этом там: https://docs.spring.io/spring-data/jpa/docs/2.1.2.RELEASE/reference/html/#repositories.custom-implementations

UPD: Прочтите внимательно, потому что есть некоторые важные вещи, например, Наиболее важной частью имени класса, соответствующей интерфейсу фрагмента, является постфикс Impl.

Также в документации сказано: Пользовательские реализации имеют более высокий приоритет, чем базовые аспекты реализации и репозитория.

0 голосов
/ 08 ноября 2018

Если вы хотите сохранить поведение Spring для удаления, но хотите, чтобы некоторая логика выполнялась до или после, вы можете использовать методы интерфейса java8 по умолчанию и попробовать следующее:

public interface UserRepo extends JpaRepository<User, Long> {

    default void customDelete(User user) {
       // before logic
       // ..
       delete(user); // actual call to deletion
       // after logic
       // ..
     }

}
0 голосов
/ 08 ноября 2018
public interface UserRepo extends JpaRepository<User, Long> {
    @Modifying
    @Query("delete from User u where u.email = ?1")
    void deleteByEmail(String email);

}
0 голосов
/ 08 ноября 2018

Привет, вы можете написать свою собственную реализацию записи интерфейса с EntityManager и расширить в вашем интерфейсе вот пример:

На самом деле, есть еще один способ написать что-то вроде:

 User findByUsername(String username) // it will find the user by specific username 

данные весны создадут вам реализацию этого метода Таким же образом вы можете создать свой собственный метод удаления

Вот полезные ссылки:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations

По этой ссылке вы можете перейти к части 2.3 QueryMethods:

Вы также можете определить @NameQuery в своем классе сущности:

@Entity
@Table(name = "employee", schema="spring_data_jpa_example")
@NamedQuery(name = "Employee.yourMethodQueryName",
        query = "yourQuery"
)
public class Employee {}

@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long> {

    List<Employee> yourMethodQueryName(Your list of params);
}

Вот ссылка с образцом:

Я думаю, что это полезно для вас

0 голосов
/ 08 ноября 2018

Есть несколько способов сделать это в зависимости от того, что вы пытаетесь сделать:

Я предпочитаю использовать наименование метода, если это возможно, имя метода становится длинным, но вы точно знаете, что он делает, посмотрев на него.

0 голосов
/ 08 ноября 2018

Не уверен, что понимаю вас достаточно ясно, но давайте попробуем:

... Я должен реализовать все findByX ...

Нет, Spring сгенерирует фрагмент JPQL, если вы назовете методы в своем интерфейсе с подходящей конвекцией. Пожалуйста, посмотрите на this и this статьи

... Есть ли аннотация для добавления в функцию в классе Entity так он работает при вызове UserRepo.delete (myUser)? ...

Вы можете использовать @PreRemove / @PostRemove аннотацию для метода в вашем классе сущности:

@PreRemove / @PostRemove
public void someMethod() { ... }
0 голосов
/ 08 ноября 2018

В вашем случае код будет выглядеть следующим образом:

public interface UserRepo extends JpaRepository<User, Long>
{
    findUserById(long id);

    findUserByEmail(String email);

    // etc...
}

public interface UserRepositoryCustom {

    void deleteByEmail(String email);
}

public interface UserRepositoryImpl implements UserRepositoryCustom {

    public void deleteByEmail(String email) {
        //provide your custom implimentation
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...