在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ Spring Data Jpa findOne()比findById()執(zhí)行速度

Spring Data Jpa findOne()比findById()執(zhí)行速度慢很多

我寫了兩個(gè)實(shí)體類,A, B,其中A和B是一對(duì)多的關(guān)系,A類和C類也有主外鍵關(guān)聯(lián)。如下
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;
}
    
在做查詢的時(shí)候,BRepository.findOne(id) 的執(zhí)行速度非常慢,大概要6s,但是用BRepository.findFirstById(id) 就快很多,大概是100ms。
其中ARepository.findOne(id)執(zhí)行也很快,300ms左右,我覺得應(yīng)該是B實(shí)體類的問題,會(huì)不會(huì)是因?yàn)锽關(guān)聯(lián)A,但是A又關(guān)聯(lián)C,導(dǎo)致B里面有多重關(guān)聯(lián)??墒遣幻靼譮indOne為什么比findBy這種要慢那么多。求大神指教 
回答
編輯回答
下墜

你好,部分歷史信息中存在他們的對(duì)比描述
Spring Data JPA 之 getOne() 和 findOne() 的區(qū)別 簡(jiǎn)易版
spring-data-jpa中findOne與getOne的區(qū)別 詳細(xì)版

目前我在項(xiàng)目中用SpringBoot2.0與Java8時(shí),findOne其實(shí)已經(jīng)被修改了
現(xiàn)在findOne是將找到一個(gè)QueryByExampleExecutor接口中定義的方法,
最后通過接口SimpleJpaRepository的默認(rèn)實(shí)現(xiàn)來CrudRepository實(shí)現(xiàn)。
此方法是通過示例搜索查詢,不希望你將其作為替換。

實(shí)際上,具有相同行為的方法仍然存在于新API中,但方法名稱已更改。
它是從更名findOne()到findById()的CrudRepository接口:

Optional<T> findById(ID id); 

你可以通過findById(id).get()來獲取具象化對(duì)象。

通常,當(dāng)您按ID查找實(shí)體時(shí),如果未檢索到該實(shí)體,則要返回該實(shí)體或進(jìn)行特定處理。

這里有兩個(gè)經(jīng)典的用例。

1)假設(shè)如果找不到實(shí)體,則要拋出異常,否則要返回它。

你可以寫:

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

2)假設(shè)您要根據(jù)是否找到實(shí)體來應(yīng)用不同的處理(無需拋出異常)。

你可以寫:

Optional<Foo> fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()){
    Foo foo = fooOptional.get();
   // processing with foo ...
}
else{
   // alternative processing....
}
2018年5月23日 08:58