所以我在这里遵循教程: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本身不会这样做吗?
感谢您的帮助。
答案 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,您可以采用多种方式:
在这两种情况下,您无需直接实现此处声明的界面:
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
参数。