最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring JPA自定義查詢結(jié)果的接收方式

 更新時(shí)間:2024年01月20日 10:06:27   作者:曉風(fēng)殘?jiān)碌? 
這篇文章主要介紹了Spring JPA自定義查詢結(jié)果的接收方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、標(biāo)準(zhǔn)使用方法

//構(gòu)建實(shí)體類
@Getter
@Setter
@Entity
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private Integer age;
    private String address;
}
//繼承JPA
public interface UserRepository extends JpaRepository<User,Long> {
}
//調(diào)用測試
@RunWith(SpringRunner.class)
@SpringBootTest
class UserTest {
    @Autowired
    UserRepository userRepository;
    @Test
    void testUser() {
        User newUser = User.builder()
				        .id(1L)
				        .username("zhangsan")
				        .age(18)
				        .address("北京市").build();
        User savedUser = userRepository.save(newUser);
        assertEquals("zhangsan",savedUser.getUsername());
    }
}

如圖所示,插入成功。

二、自定義查詢結(jié)果的接收

假設(shè)我們不想查詢user表中的所有字段,而只需要其中的幾個(gè)字段作為前端輸出。

當(dāng)然,JPA給我們提供了自定義SQL的功能進(jìn)行個(gè)性化的查詢。使用@Query就可以自定義SQL語句,編寫自定義的查詢語句了。

但是,它的使用方式分為兩種:

  • 一種是特定JPQL語言,這是通過實(shí)體對象來查詢屬性,而不用考慮對應(yīng)的表名稱和字段名稱。
  • 一種是SQL語言,還是像原來一樣操作對應(yīng)的表和字段。

1.那么在UserRepository 中應(yīng)該怎么寫自定義查詢語句呢?

//創(chuàng)建個(gè)性化的DTO用于接收
@Value
public class UserDTO {
    Long id;
    String username;
}
//寫sql語句
public interface UserRepository extends JpaRepository<User,Long> {
    //@Query("select u from User u where u.id =?1")
    //是像這樣,還是怎么寫呢?
    UserDTO findUserDTOByID(Long id);
}
//調(diào)用
@RunWith(SpringRunner.class)
@SpringBootTest
class UserTest {
    @Autowired
    UserRepository userRepository;

    @Test
    void testUserDTO() {
        UserDTO dto = userRepository.findUserDTOByID(1L);
        assertEquals("zhangsan",dto.getUsername());
        
    }
}

可能的錯(cuò)誤的查詢方式:

//1.意圖User實(shí)體自動(dòng)映射某些屬性到UserDTO
public interface UserRepository extends JpaRepository<User,Long> {
    @Query("select u from User u where u.id =?1")
    UserDTO findUserDTOByID(Long id);
    //但是會(huì)報(bào)org.springframework.core.convert.ConverterNotFoundException錯(cuò)誤
}
//2.意圖挑出User的某些字段會(huì)自動(dòng)映射到UserDTO
public interface UserRepository extends JpaRepository<User,Long> {
    @Query("select u.id,u.username from User u where u.id =?1")
    UserDTO findUserDTOByID(Long id);
    //但是會(huì)報(bào)org.springframework.core.convert.ConverterNotFoundException錯(cuò)誤
}
//3.意圖挑出User的某些字段會(huì)自動(dòng)映射到UserDTO
public interface UserDTORepository extends JpaRepository<UserDTO,Long> {
    @Query("select u.id,u.username from User u where u.id =?1")
    UserDTO findByID(Long id);
    //但是這會(huì)生成一個(gè)新表
}

在上面雖然UserDTO只是User中的子集,只有它的兩個(gè)屬性,但是如果直接用UserDTO接收查詢結(jié)構(gòu),就會(huì)報(bào)這種 類型轉(zhuǎn)換錯(cuò)誤。

這是因?yàn)閁serRepository是實(shí)體對象User的倉庫,必須用User來接收,不能用別的對象來接收。

那么我們能不能再創(chuàng)建一個(gè)UserDTORepository來接收查詢結(jié)果呢?

這是不行的,因?yàn)閁serDTORepository必須映射對應(yīng)的表,才能查詢UserDTO對象。而我們當(dāng)然不希望又創(chuàng)建與User相似的表。

正確的查詢方式:

//1.使用Object接收
public interface UserRepository extends JpaRepository<User,Long> {
    @Query("select u.id,u.username from User u where u.id =?1")
    Object findUserDTOByID(Long id);
    //倒是能接收到結(jié)果,但是丟失了屬性名稱,必須數(shù)組的索引訪問,不方便
}
//2.使用全限定名接收
public interface UserRepository extends JpaRepository<User,Long> {
    @Query("select new com.example.admin.ums.domain.user.UserDTO(id,username) from User u where u.id =?1")
    UserDTO findUserDTOByID(Long id);
    //能接收到結(jié)果,但是UserDTO必須有構(gòu)造函數(shù),帶上所有參數(shù),也不方便
}
//3.定義接口來接收,使用的是projections接口投影機(jī)制
public interface IUser {
	//定義這些getter方法才能接收結(jié)果
    Long getId();
    String getUsername();
}
//用接口接收查詢結(jié)果
public interface UserRepository extends JpaRepository<User,Long> {
    @Query("select u.id as id ,u.username as username  from User u where u.id =?1")
    IUser findUserDTOByID(Long id);
    //能查詢到結(jié)果,但是必須用接口接收,可能不習(xí)慣
}
//4.泛型動(dòng)態(tài)查詢投影
public interface UserRepository extends JpaRepository<User,Long> {
    <T> T  findById(Long id, Class<T> type);
    //只需要輸入ID和類類型就能查到結(jié)果,這個(gè)利用了方法名的查詢生成器機(jī)制,不用專門寫@Query
    //同時(shí)使用動(dòng)態(tài)查詢投影,所以不用輸入很多參數(shù),方便了很多,強(qiáng)烈推薦
}
//5.用Map接收查詢的結(jié)果
public interface UserRepository extends JpaRepository<User,Long> {
    @Query("select u.id as id ,u.username as username, u.address as address  from User u where u.id =?1")
    Map<String,Object> findUserDTO(Long id);
    //需要寫JPQL語句,必須用as取別名,否則就沒有key值
    //優(yōu)點(diǎn)是不用構(gòu)造DTO直接輸出給前端
    //缺點(diǎn)是查出來的不是對象,不方便再處理業(yè)務(wù)邏輯,若參數(shù)很多,就會(huì)很繁瑣    
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot線程池監(jiān)控的簡單實(shí)現(xiàn)

    springboot線程池監(jiān)控的簡單實(shí)現(xiàn)

    本文主要介紹了springboot線程池監(jiān)控的簡單實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java中的interrupt、interrupted和isInterrupted方法區(qū)別詳解

    Java中的interrupt、interrupted和isInterrupted方法區(qū)別詳解

    這篇文章主要介紹了Java中的interrupt、interrupted和isInterrupted方法區(qū)別詳解,interrupt用于中斷線程,調(diào)用該方法的線程的狀態(tài)將會(huì)被設(shè)置為中斷狀態(tài),線程中斷僅僅是設(shè)置線程的中斷狀態(tài)位,并不會(huì)停止線程,需要用戶自己去監(jiān)視線程的狀態(tài)并作出處理,需要的朋友可以參考下
    2023-12-12
  • MybatisPlus實(shí)現(xiàn)邏輯刪除功能

    MybatisPlus實(shí)現(xiàn)邏輯刪除功能

    這篇文章主要介紹了MybatisPlus實(shí)現(xiàn)邏輯刪除功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • SpringBoot?啟動(dòng)流程追蹤方法分享

    SpringBoot?啟動(dòng)流程追蹤方法分享

    這篇文章主要介紹了SpringBoot?啟動(dòng)流程追蹤方法分享的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • SpringBoot Redisson 集成的實(shí)現(xiàn)示例

    SpringBoot Redisson 集成的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot Redisson 集成的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • java 題解LeetCode38外觀數(shù)列示例

    java 題解LeetCode38外觀數(shù)列示例

    這篇文章主要為大家介紹了java 題解LeetCode38外觀數(shù)列示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java HttpClient技術(shù)詳解

    Java HttpClient技術(shù)詳解

    Http協(xié)議的重要性相信不用我多說了,HttpClient相比傳統(tǒng)JDK自帶的URLConnection,增加了易用和靈活性(具體區(qū)別,日后我們再討論),它不僅是客戶端發(fā)送Http請求變得容易,而且也方便了開發(fā)人員測試接口(基于Http協(xié)議的),即提高了開發(fā)的效率,也方便提高代碼的健壯性
    2021-10-10
  • 基于java實(shí)現(xiàn)斗地主代碼實(shí)例解析

    基于java實(shí)現(xiàn)斗地主代碼實(shí)例解析

    這篇文章主要介紹了基于java實(shí)現(xiàn)斗地主代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java實(shí)現(xiàn)預(yù)覽與打印功能詳解

    Java實(shí)現(xiàn)預(yù)覽與打印功能詳解

    在?Java?中,打印功能主要依賴?java.awt.print?包,該包提供了與打印相關(guān)的一些關(guān)鍵類,比如?PrinterJob?和?PageFormat,它們構(gòu)成了?Java?打印框架的核心,接下來我們將一步步實(shí)現(xiàn)一個(gè)簡單的預(yù)覽和打印功能,需要的朋友可以參考下
    2025-07-07
  • java8實(shí)現(xiàn)List中對象屬性的去重方法

    java8實(shí)現(xiàn)List中對象屬性的去重方法

    這篇文章主要介紹了java8實(shí)現(xiàn)List中對象屬性的去重方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

定结县| 武川县| 保定市| 丹阳市| 琼结县| 庆安县| 大港区| 古交市| 灵山县| 泸水县| 邯郸县| 莎车县| 济宁市| 昌乐县| 象山县| 乌兰浩特市| 和政县| 商南县| 宝山区| 台南县| 香格里拉县| 佛学| 新和县| 清水河县| 哈巴河县| 曲麻莱县| 阳曲县| 河津市| 安丘市| 福贡县| 彩票| 云和县| 益阳市| 抚顺市| 仁化县| 南召县| 福贡县| 青海省| 驻马店市| 常州市| 渑池县|