JpaRepository中的自定义删除方法

时间:2018-11-08 10:49:11

标签: spring spring-boot spring-data-jpa spring-data

我想知道是否有一种方法可以覆盖某些JpaRepository的delete方法,而不必覆盖其余方法。

目前我有类似的东西

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>

我想重写public interface UserRepo extends JpaRepository<User, Long> { findUserById(long id); findUserByEmail(String email); // etc... } 中的delete(T Entity)方法。为此,我尝试实现CrudRepository,但是随后我必须实现所有的UserRepo,而对于如何正确地做到这一点并没有真正的发现。

是否有任何注释要添加到Entity类的函数中,以便在您调用findByX时运行?

谢谢!

7 个答案:

答案 0 :(得分:2)

除了Raheela Aslam帖子:

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后缀。

该文档还说: 自定义实现的优先级高于基本实现和存储库方面。

答案 1 :(得分:1)

不确定我是否理解得足够清楚,但请尝试:

  

...我必须实现所有findByX ...

您没有,如果您在接口中使用合适的对流命名方法,spring会生成JPQL代码段,请查看thisthis文章

  

...在Entity类中是否有要添加到函数的注释   所以它在您调用UserRepo.delete(myUser)时运行? ...

您可以在实体类中的方法上使用import Track from './Track'; //eslint-disable-line no-unused-vars export default class TrackList { /** * Creates a new track list. * @param {Iterable<Track>} tracks the tracks to include */ constructor(tracks) { this._tracks = tracks ? Array.from(tracks) : []; } ... / @PreRemove批注:

@PostRemove

答案 2 :(得分:0)

在您的情况下,代码如下:

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
    }
}

答案 3 :(得分:0)

有几种方法可以执行此操作,具体取决于您要执行的操作:

如果可能的话,我更喜欢使用方法命名,方法名称会很长,但是通过查看它可以确切知道它的作用。

答案 4 :(得分:0)

您好,您可以使用EntityManager和 在您的界面中扩展,这里是示例:

实际上,还有另一种方式是通过类似这样的东西来写作:

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

spring数据将为您创建此方法的实现 您可以使用相同的方法创建自己的删除方法

以下是有用的链接:

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);
}

这里是示例链接:

我认为这对您有帮助

答案 5 :(得分:0)

public interface UserRepo extends JpaRepository<User, Long> {
    @Modifying
    @Query("delete from User u where u.email = ?1")
    void deleteByEmail(String email);

}

答案 6 :(得分:0)

如果您想保留Spring的行为以便删除,但是想要在执行之前或之后执行一些逻辑,则可以使用java8的接口默认方法,然后尝试以下操作:

public interface UserRepo extends JpaRepository<User, Long> {

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

}