Spring data jpa.部分自定义存储库实现

koaltpgm  于 2023-04-06  发布在  Spring
关注(0)|答案(2)|浏览(127)

我们可以编写仓库的自定义实现:

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会解决这个问题吗?

k5ifujac

k5ifujac1#

我认为唯一的解决方案是将方法拆分为两个接口:第一个-用于spring查询方法,第二个-用于自定义实现,如doc:http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#repositories.single-repository-behaviour。
但我认为使用抽象类的解决方案会更自然和逻辑:你只需要提供所需的方法实现,而spring数据会为你完成剩下的工作。

oug3syen

oug3syen2#

假设你有一个仓库,里面有几个方法,它们的实现是由Spring生成的:

interface UserRepository extends CrudRepository<User,String> {
    List<User> findUserByLastname(String lastName);
}

为了添加具有自定义实现的方法,您需要创建另一个接口,该接口仅包含您想要自定义的方法,并使您的存储库扩展自定义的方法:

interface CustomUserRepository {
    User someCustomMethod();
}

interface UserRepository extends CrudRepository<User,String>, CustomUserRepository {
    List<User> findUserByLastname(String lastName);
}

然后,您可以通过为新接口创建一个实现类来实现额外的方法:

class CustomUserRepositoryImpl implements CustomUserRespository {
    @Override
    User someCustomMethod() {
        // implementation goes here.
    }
}

在这里,类名很重要:为了让Spring找到它,它应该是在末尾扩展了Impl的接口的名称。
实现存储库是一个普通的Springbean,因此您可以自动连接一个构造函数来注入各种依赖项。
这里有一个更详细的教程:https://www.baeldung.com/spring-data-composable-repositories .

相关问题