【问题标题】:How does findById and similar methods work in Spring?findById 和类似方法在 Spring 中如何工作?
【发布时间】:2019-01-28 14:31:33
【问题描述】:

这些天我正在努力学习 JPA 和 Spring 的内部处理。

我对 findById()findNameById() 等存储库功能感到困惑。

  1. 这些函数是如何工作的,它们在每次调用时都会访问数据库吗? 可以说,如果执行以下操作

    for(loop 1million ids) {SomeRepo.findById(Long Id);}

数据库会被点击100万次吗?

  1. 如果 @Query 用于简单的数据库调用,假设根据名称获取 id,那么它在 db 调用和处理方面将如何工作?

【问题讨论】:

  • “这些天我正在尝试学习 JPA 和 Spring 的内部处理” - 好的,但我暂时不考虑 spring-data。首先关注 JPA 的基础知识。
  • 是的,我现在的重点是 JPA,你能推荐任何我应该看到的关于这个主题的网站或博客吗?

标签: mysql spring spring-boot spring-data-jpa


【解决方案1】:

如果您在for 循环中调用 db,它将命中 db 100 万次,除非您使用缓存,否则框架无法避免这种情况。 而不是使用for(loop 1million ids){ SomeRepo.findById(Long Id);}

您应该使用 findByIdIn(List<long> ids) 并进行单个 db 调用(必要时使用 ids 分页)

@Query 做同样的事情,你可以使用你喜欢的,但是可能会发生方法名太长的例子:

List<Person> findByPersonAddressNameAndPersonAddressNumberOrderByPersonAddressNameDesc(String addressName, Long addressNumber)

在这种情况下,您可以使用查询注释为您的方法选择一个缩写名称

  @Query(from Person where person.address.name = :name and person.address.number = :number order by person.address.number desc);
  public List<Person> findByAddressAndNumber(String name, Long number)

【讨论】:

  • 在第二个问题中,我的意思是,使用@Query 注释编写查询以获取名称,它将如何工作?想问这两个问题,jpa/Spring 对代理对象不起作用吗?我在某处读到,对于这些方法,Spring 使用代理对象,尽管他们对此没有给出太多解释。
  • 澄清一下,如果对象已经加载到当前的 EntityManager 中,findById 将不会查询数据库,例如当我们的代码已经在 @Transactional 上下文中时。
猜你喜欢
  • 2020-04-03
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多