Spring Data Jpa findOne()比findById()执行速度慢很多

新手上路,请多包涵

我写了两个实体类,A, B,其中A和B是一对多的关系,A类和C类也有主外键关联。如下
A类:

@Entity
public class A implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GenericGenerator(name = "idGenerator", strategy = "uuid")
    @GeneratedValue(generator = "idGenerator")
    private String id;

    @Column(nullable = false)
    @NotBlank
    private String name;
    
    @ManyToOne
    @JoinColumn(name = "cId", referencedColumnName="id")
    private C c;
}
    

B类:

@Entity
public class B implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GenericGenerator(name = "idGenerator", strategy = "uuid")
    @GeneratedValue(generator = "idGenerator")
    private String id;

    @Column(nullable = false)
    @NotBlank
    private String name;
    
    @ManyToOne
    @JoinColumn(name = "aId", referencedColumnName="id")
    private A a;
}
    
在做查询的时候,BRepository.findOne(id) 的执行速度非常慢,大概要6s,但是用BRepository.findFirstById(id) 就快很多,大概是100ms。
其中ARepository.findOne(id)执行也很快,300ms左右,我觉得应该是B实体类的问题,会不会是因为B关联A,但是A又关联C,导致B里面有多重关联。可是不明白findOne为什么比findBy这种要慢那么多。求大神指教 
阅读 10.1k
1 个回答

你好,部分历史信息中存在他们的对比描述
Spring Data JPA 之 getOne() 和 findOne() 的区别 简易版
spring-data-jpa中findOne与getOne的区别 详细版

目前我在项目中用SpringBoot2.0与Java8时,findOne其实已经被修改了
现在findOne是将找到一个QueryByExampleExecutor接口中定义的方法,
最后通过接口SimpleJpaRepository的默认实现来CrudRepository实现。
此方法是通过示例搜索查询,不希望你将其作为替换。

实际上,具有相同行为的方法仍然存在于新API中,但方法名称已更改。
它是从更名findOne()到findById()的CrudRepository接口:

Optional<T> findById(ID id); 

你可以通过findById(id).get()来获取具象化对象。

通常,当您按ID查找实体时,如果未检索到该实体,则要返回该实体或进行特定处理。

这里有两个经典的用例。

1)假设如果找不到实体,则要抛出异常,否则要返回它。

你可以写:

return repository.findById(id)
        .orElseThrow(() -> new NotFoundEntity(id));

2)假设您要根据是否找到实体来应用不同的处理(无需抛出异常)。

你可以写:

Optional<Foo> fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()){
    Foo foo = fooOptional.get();
   // processing with foo ...
}
else{
   // alternative processing....
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏