我想知道是否有一种方法可以覆盖某些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
时运行?
谢谢!
答案 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代码段,请查看this和this文章
...在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数据将为您创建此方法的实现 您可以使用相同的方法创建自己的删除方法
以下是有用的链接:
在此链接中,您可以转到第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
// ..
}
}