我正在编写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或弹簧数据存储库方法。