91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?Data?JPA在@Query中怎么使用投影

發布時間:2022-07-18 13:52:19 來源:億速云 閱讀:176 作者:iii 欄目:開發技術

本篇內容主要講解“Spring Data JPA在@Query中怎么使用投影”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring Data JPA在@Query中怎么使用投影”吧!

Spring Data JPA 在 @Query 中使用投影的方法

測試代碼

@Test
public void whenUsingOpenProjections_thenViewWithRequiredPropertiesIsReturned() {
        PersonView personView = personRepository.findByLastName("Doe");
}
public interface PersonView {
    String getLastName();
}
@Entity
public class Person {
    @Id
    private Long id;
    private String firstName;
    private String lastName;
}

執行的 SQL

select person0_.last_name as col_0_0_ from person person0_ where person0_.last_name=?

然后當我換成自定義查詢的方式時,效果就變成了這樣:

測試代碼

@Query("select p from Person p where p.lastName = ?1")
PersonView findByLastNameByQuery(String lastName);
@Test
public void whenUsingOpenProjections_thenViewWithRequiredPropertiesIsReturned2() {
        PersonView personView = personRepository.findByLastNameByQuery("Doe");
}

執行的SQL

select person0_.id as id1_6_, person0_.first_name as first_na2_6_, person0_.last_name as last_nam3_6_ from person person0_ where person0_.last_name=?

可以看到這里是查詢了全部的字段(實在是讓人摸不著頭腦)。

后來有同事提醒說是因為我寫了select p導致的,我就嘗試寫明要查詢的字段(但還是無法理解為什么在這種情況下投影直接不生效):
測試代碼

@Query("select p.lastName from Person p where p.lastName = ?1")
PersonView findByLastNameByQuery(String lastName);

執行的 SQL

select person0_.last_name as col_0_0_ from person person0_ where person0_.last_name=?

從 SQL 上來看,這樣寫已經是實現了我想要的效果,可是實際上真正使用這個代碼的時候,坑就又來了:
測試代碼

@Test
public void whenUsingOpenProjections_thenViewWithRequiredPropertiesIsReturned2() {
        PersonView personView = personRepository.findByLastNameByQuery("Doe");
        assertThat(personView.getLastName()).isEqualTo("Doe");
}

加了一行斷言來模擬使用的場景
執行結果

org.opentest4j.AssertionFailedError: 
expected: "Doe"
 but was: null
Expected :"Doe"
Actual   :null

直接黑人問號臉。

分析了一下,執行的 SQL 沒有問題,投影類也沒有問題,那問題就是出在結果集映射的時候了。雖然沒看過 JPA 的代碼,但是最終肯定是基于 JDBC API 的,而JDBC API是怎么處理結果集映射的?
翻一翻 ResultSet 類可以看到一共有兩種方法獲取結果:by indexby name,仔細看看執行的 SQL,person0_.last_name as col_0_0_ last_name 自動生成了一個別名叫col_0_0_,而投影類中能獲得的信息只有字段名last_name而沒有別名col_0_0_,所以 by name 的路走不通;
那么by index呢,很明顯也不行,我這里的示例只有一個字段,假如有兩個字段,那么SQL 中的字段的順序和投影類中的字段的順序就無法保證一致,從而就無法根據 index 來獲取想要的對應的結果。

然后就是驗證環節了,假如是因為名字映射不上導致的結果為 null,那我就給你一個能對應的名字:
測試代碼

@Query("select p.lastName as lastName from Person p where p.lastName = ?1")
PersonView findByLastNameByQuery(String lastName);

@Test
public void whenUsingOpenProjections_thenViewWithRequiredPropertiesIsReturned2() {
        PersonView personView = personRepository.findByLastNameByQuery("Doe");
        assertThat(personView.getLastName()).isEqualTo("Doe");
}

執行的 SQL

select person0_.last_name as col_0_0_ from person person0_ where person0_.last_name=?

雖然執行的 SQL 上還是用了自動生成的別名,但是斷言卻通過了,猜測是 JPA 在解析 Query 的時候存儲了手動聲明的別名信息。

到此,相信大家對“Spring Data JPA在@Query中怎么使用投影”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

闽清县| 饶河县| 怀宁县| 嘉善县| 长顺县| 桃园市| 杂多县| 韩城市| 新龙县| 修文县| 启东市| 潞城市| 乌兰县| 郸城县| 扶余县| 集贤县| 望城县| 正镶白旗| 得荣县| 大港区| 乐陵市| 鹿泉市| 上杭县| 奎屯市| 永康市| 富裕县| 通榆县| 大安市| 舒兰市| 黑龙江省| 尚义县| 耿马| 康平县| 板桥市| 班戈县| 邵阳县| 龙口市| 苗栗市| 焦作市| 新和县| 无棣县|