使用@Query vs findAll()通过CrudRepository哪个是更快的自定义查询?

时间:2019-07-04 18:18:13

标签: java sql database hibernate jpa

我正在编写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内部方法是否比自定义查询提供更快的速度?

谢谢。

2 个答案:

答案 0 :(得分:1)

Spring Data Repository提供的默认findById和带有查询注释的方法具有明显不同的语义。但是,为了简短起见,我将尝试专门关注性能差异。

除非您启用了查询缓存,否则带有查询注释的方法将始终通过查询访问数据库

另一方面,

findById最终称为EntityManager.find()EntityManager.find() 首先在持久性上下文中查找实体。这意味着,如果该实体已经加载到上下文中,则调用将不会访问基础数据库

作为旁注,如果您对Spring如何实现默认存储库方法感到好奇,请查看SimpleJpaRepository的来源。

答案 1 :(得分:-1)

您必须了解findAll()方法最终会生成用于选择的查询。证明这一点的唯一方法是对其进行测试。我认为您不会获得显着的性能提升。另一方面,JPA的查询生成非常容易理解和使用。因此,如果您犹豫使用哪种方法,我会坚持使用findAll() JPA或spring数据存储库方法。