我们可以编写仓库的自定义实现:
interface UserRepositoryCustom {
public void someCustomMethod(User user);
}
class UserRepositoryImpl implements UserRepositoryCustom {
public void someCustomMethod(User user) {
// Your custom implementation
}
}
但是如果我只想定制一些方法呢?例如:
interface UserRepositoryCustom {
public User findByFirstName(String firstName);
@Query("select u.firstName from User u where u.age > 18")
public Set<String> findAllAdultUsers();
public void someCustomMethod(User user);
}
class UserRepositoryImpl implements UserRepositoryCustom {
//I want implement only this method
public void someCustomMethod(User user) {
// Your custom implementation
}
}
如果我声明了一个类,它实现了一个接口,我必须实现所有的方法,但我只想为一个方法编写自定义逻辑。有可能做到这一点吗?也许我可以让这个类抽象?spring data会解决这个问题吗?
2条答案
按热度按时间k5ifujac1#
我认为唯一的解决方案是将方法拆分为两个接口:第一个-用于spring查询方法,第二个-用于自定义实现,如doc:http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#repositories.single-repository-behaviour。
但我认为使用抽象类的解决方案会更自然和逻辑:你只需要提供所需的方法实现,而spring数据会为你完成剩下的工作。
oug3syen2#
假设你有一个仓库,里面有几个方法,它们的实现是由Spring生成的:
为了添加具有自定义实现的方法,您需要创建另一个接口,该接口仅包含您想要自定义的方法,并使您的存储库扩展自定义的方法:
然后,您可以通过为新接口创建一个实现类来实现额外的方法:
在这里,类名很重要:为了让Spring找到它,它应该是在末尾扩展了
Impl
的接口的名称。实现存储库是一个普通的Springbean,因此您可以自动连接一个构造函数来注入各种依赖项。
这里有一个更详细的教程:https://www.baeldung.com/spring-data-composable-repositories .