繁体   English   中英

Spring CommandLineRunner接口实现

[英]Spring CommandLineRunner Interface Implementation

因此,我在这里关注该教程: 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本身不会这样做吗?

感谢您的协助。

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

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

您需要记住的要点是, Spring数据几乎没有规则可以从方法名称派生sql查询 (例如findByLastName()findByLastnameOrderByFirstnameAsc()等。),您可以在此处查看以了解方法名称的工作方式它们与您的实体bean的字段名称有关

如果您想编写一些无法从方法名称派生的复杂查询,则可以对方法使用@Query

如果我将某个类设为公共类,则Cust实现了CustomerRepository,当它要求我必须实现findByLastName(String lastName)时,该怎么办? JPA应该照顾的方法?

如果要实现存储库以为少数几个方法提供自定义行为,则可以做到这一点(例如类Cust实现CustomerRepository ),可以参考“在自定义实现中使用JpaContext”一节,这很好参考文档中解释。

因此,如果我对其进行扩展,是否不必重写findbylastname()方法,这意味着JPA本身不会这样做吗?

不,不是由JPA负责,而是由APO生成一些JPA处理的Spring。

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

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

在这两种情况下,您都不需要直接实现在此声明的接口:

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

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

当春季检查您的接口,并认为该方法findByLastName(String lastName)它的方法名关联到一个查询其是否与匹配 找到 lastName字段。 因此,它将生成一个JPQL查询,如下所示:

select c from Customer c where c.lastName=%lastName

并使用调用该方法时使用的有效参数设置lastName参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM