Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@query与findAll()通过Crudepository进行自定义查询,哪个更快?_Java_Sql_Database_Hibernate_Jpa - Fatal编程技术网

Java 使用@query与findAll()通过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); } 或

我正在编写Java代码以从数据库表中获取所有行

我使用的是Crudepository,使用的方法如下

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);