Java 使用@query与findAll()通过Crudepository进行自定义查询,哪个更快?
我正在编写Java代码以从数据库表中获取所有行 我使用的是Crudepository,使用的方法如下Java 使用@query与findAll()通过Crudepository进行自定义查询,哪个更快?,java,sql,database,hibernate,jpa,Java,Sql,Database,Hibernate,Jpa,我正在编写Java代码以从数据库表中获取所有行 我使用的是Crudepository,使用的方法如下 public interface StudentRepository extends CrudRepository<Student, Long> { public List<Student> findById(long id); } 公共界面StudentRepository扩展了crudepository { 公共列表findById(长id); } 或
public interface StudentRepository extends CrudRepository<Student, Long>
{
public List<Student> findById(long id);
}
公共界面StudentRepository扩展了crudepository
{
公共列表findById(长id);
}
或
@Query(value=“从学生s中选择s”)
列表自定义方法(长id);
哪种方法更快?Java内部方法是否提供比自定义查询更快的查询速度
提前感谢。您必须了解
findAll()
方法最终会生成选择的查询。证明这一点的唯一方法是测试它。我认为您不会获得显著的性能提升。另一方面,JPA的查询生成非常容易理解和使用。因此,如果您在使用一种或另一种方法之间犹豫不决,我将坚持使用findAll()
JPA或spring数据存储库方法。spring数据存储库提供的默认findById
和查询注释方法具有明显不同的语义。但是,为了简短起见,我将尝试只关注性能上的差异
除非已启用查询缓存,否则带查询注释的方法将始终使用查询命中数据库
另一方面,findById
最终调用EntityManager.find()
EntityManager.find()
首先在持久性上下文中查找实体。这意味着,如果实体已经加载到上下文中,调用将不会命中基础数据库
另外,如果您对Spring如何实现默认存储库方法感到好奇,请查看
SimpleParepository
的源代码 起初我以为我看错了你的问题,但后来我意识到你要求获取所有行,而这两个代码片段都显示了一个将id
作为参数的方法。请拿定主意;)根据我们的答案,我们可以说我们应该使用查询方法而不是@queyi吗?如果您的意思是我们应该更喜欢findById()
,那么实际上,是的。您必须理解,JPA永远不会将同一实体的两个副本加载到同一个持久性上下文中。如果实体已经在上下文中,即使您选择了SELECT。。。。其中id=:id
,最终您将获得已加载的版本,但仍然需要执行查询。这是因为查询总是针对数据库运行,而不是针对内存缓存。请注意,对于其他存储库方法,如findAll()
,这一结论并不正确,因为在内部,它们使用查询(不同于findById()
),假设我必须根据两列查找数据,例如:@Query(“从Todo t中选择t,其中t.title=?1和t.description=?2”)公共可选FindBytileAndDescription(字符串标题,字符串描述);第二个选项是公共可选FindBytileAndDescription(字符串标题,字符串描述);现在,如果JPA已经在上下文中加载了这个实体,那么就没有必要使用@Query注释。但是我的问题是,我们如何知道JPA已经在他的上下文中加载了这个实体。
@Query(value = "SELECT s FROM Student s")
List<Student> customMethod(long id);