使用@query vs findall()到crudrepository,这是更快的自定义查询



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

预先感谢。

弹簧数据存储库提供的默认findById和查询声明的方法具有显着不同的语义。但是,简而言之,我将尝试专注于绩效的差异。

除非启用查询缓存,否则查询的方法将始终使用查询访问数据库

另一方面,

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

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

您必须了解findAll()方法最终会生成选择的查询。证明测试的唯一方法。我认为您不会获得重大的性能。另一方面,JPA的查询生成非常容易理解和使用。因此,如果您在使用一个或另一个之间犹豫,我会坚持使用findAll() JPA或弹簧数据存储库方法。

最新更新