Spring CommandLineRunner接口实现

时间:2016-11-27 07:27:15

标签: java spring spring-data-jpa

所以我在这里遵循教程:https://spring.io/guides/gs/accessing-data-jpa/

它工作正常,我试图在我的应用程序中实现它(因为它使JPA很容易使用),但我很困惑。

它在哪里

 @Bean
 public CommandLineRunner demo(CustomerRepository repository)

然后它作用于存储库

repository.save(new Customer("Jack", "Bauer"));
        repository.save(new Customer("Chloe", "O'Brian")); 

它如何在界面上起作用? CustomerRepository是一个接口,我无法实例化它

CustomerRepository c = new CustomerRepository() 

无法完成,我没有任何实现该界面的类。我只是想做类似

的事情
 CustomerRepository c = new CustomerRepository() 
 c.save(new Customer("whatever", "whatever")

但我只能在CommandLineRunner bean方法中使用它。为什么我可以使用commandlinerunner执行此操作但不能使用其他类?

我在想我可以创建一个扩展CustomerRepository的类,但后来我读到该接口实际上完成了所有方法实现(JPA就是这样),所以你不必担心它。

public interface CustomerRepository extends CrudRepository<Customer, Long> {

List<Customer> findByLastName(String lastName);
}

所以如果我扩展它,我不会覆盖findbylastname()方法,这意味着JPA本身不会这样做吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

  

我扩展了它,我不必覆盖findbylastname()   方法,这意味着JPA本身不会这样做吗?

不,你不需要实现这些方法,因为spring-data-jpa会处理它,你可以查看here如何在运行时由代理实际实现 Spring数据存储库接口

您需要记住的要点是 spring数据几乎没有从方法名称(例如sql,{{1}中派生findByLastName()查询的规则等等。),您可以查看here以了解方法名称的工作原理,并且它们与您的实体bean的字段名称相关

如果您想编写一些无法从方法名称派生的复杂查询,可以使用findByLastnameOrderByFirstnameAsc()作为方法。

  

如果我创建了一个类公共类,那么Cust实现CustomerRepository是什么   当它问我我必须实施时,我会这样做吗?   findByLastName(String lastName); JPA应采取的方法   照顾?

如果您想实现存储库以便为少数几种方法提供自定义行为,那么您可以这样做(如类@Query实现Cust),您可以参考该部分“在自定义实现中使用JpaContext”,它在参考文档中得到了很好的解释。

答案 1 :(得分:0)

  

所以如果我扩展它,我不会覆盖findbylastname()   方法,这意味着JPA本身不会这样做吗?

不,不是JPA做的工作,而是由APO生成的一些JPA处理的春天。

使用Spring Repository,您可以采用多种方式:

  • 编写自己的SQL / JPQL查询。
  • 使用方法名称中的命名约定来编写查询

在这两种情况下,您无需直接实现此处声明的界面:

public interface CustomerRepository extends CrudRepository<Customer, Long> {   
   List<Customer> findByLastName(String lastName);
}

因为如你所知,春天会为你完成这项工作 例如,在引用的情况下,您使用方法名称中的命名约定来编写查询。

当Spring检查您的界面并查看方法findByLastName(String lastName)时,它会将方法名称与执行查找并且匹配 {{的查询相关联1}}字段。因此,它生成一个类似的JPQL查询:

lastName

并使用调用方法时使用的有效参数设置select c from Customer c where c.lastName=%lastName 参数。