我正在编写Java代码以从数据库表中获取所有行。
我正在使用CrudRepository,并在下面使用了此方法。
public interface StudentRepository extends CrudRepository<Student, Long>
{
public List<Student> findById(long id);
}
或
@Query(value = "SELECT s FROM Student s")
List<Student> customMethod(long id);
哪种方法更快? Java内部方法是否比自定义查询提供更快的速度?
谢谢。
答案 0 :(得分:1)
Spring Data Repository提供的默认findById
和带有查询注释的方法具有明显不同的语义。但是,为了简短起见,我将尝试专门关注性能差异。
除非您启用了查询缓存,否则带有查询注释的方法将始终通过查询访问数据库。
另一方面, findById
最终称为EntityManager.find()
。 EntityManager.find()
首先在持久性上下文中查找实体。这意味着,如果该实体已经加载到上下文中,则调用将不会访问基础数据库。
作为旁注,如果您对Spring如何实现默认存储库方法感到好奇,请查看SimpleJpaRepository
的来源。
答案 1 :(得分:-1)
您必须了解findAll()
方法最终会生成用于选择的查询。证明这一点的唯一方法是对其进行测试。我认为您不会获得显着的性能提升。另一方面,JPA的查询生成非常容易理解和使用。因此,如果您犹豫使用哪种方法,我会坚持使用findAll()
JPA或spring数据存储库方法。