![](/img/trans.png)
[英]What spring annotation needs to place on commandlinerunner interface method in controller
[英]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,您可以采用多种方式:
在这两种情况下,您都不需要直接实现在此声明的接口:
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.