欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring?data?jpa查詢一個(gè)實(shí)體類的部分屬性方式

 更新時(shí)間:2022年02月24日 08:45:34   作者:peng?chao  
這篇文章主要介紹了spring?data?jpa查詢一個(gè)實(shí)體類的部分屬性方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

spring data jpa查詢一個(gè)實(shí)體類的部分屬性

使用Spring Data Repository查詢時(shí)候,通常情況下返回的是一個(gè)實(shí)體所有的屬性。但是在很多情況下,我們只需要實(shí)體類的部分屬性。下面的部分講述如何實(shí)現(xiàn)查詢一個(gè)實(shí)體類的部分屬性。

首先我們定義兩個(gè)實(shí)體類

package cn.net.leadu.domain; 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
/**
 * Created by PengChao on 2016/12/1.
 */
@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    @OneToOne
    private Address address;
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
}
package cn.net.leadu.domain; 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
 
/**
 * Created by PengChao on 2016/12/1.
 */
@Entity
public class Address {
    @Id
    @GeneratedValue
    private Long id;
    private String street;
    private String state;
    private String country;
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getStreet() {
        return street;
    }
 
    public void setStreet(String street) {
        this.street = street;
    }
 
    public String getState() {
        return state;
    }
 
    public void setState(String state) {
        this.state = state;
    }
 
    public String getCountry() {
        return country;
    }
 
    public void setCountry(String country) {
        this.country = country;
    }
}

然后創(chuàng)建person實(shí)體類的repository

package cn.net.leadu.dao; 
import cn.net.leadu.domain.Person;
import org.springframework.data.jpa.repository.JpaRepository;
 
/**
 * Created by PengChao on 2016/12/1.
 */
public interface PersonRepository extends JpaRepository<Person, Long> {
    Person findByFirstName(String firstName); // 1
}

"1"方法將會(huì)返回Person對象的所有屬性(包括address)


 

但實(shí)際情況我們不需要返回address對象,這種情況我們可以定義一個(gè)projection,如下:

package cn.net.leadu.domain;
/**
 * Created by PengChao on 2016/12/1.
 */
public interface NoAddress {
    String getFirstName(); //2
    String getLasetName(); //3
}

“2”輸出person對象的firstName屬性,“3”輸出person對象的lastName屬性

最后在Person實(shí)體類的repository中定義一個(gè)查詢方法,返回值是NoAddress,如下

package cn.net.leadu.dao;
import cn.net.leadu.domain.NoAddress;
import cn.net.leadu.domain.Person;
import org.springframework.data.jpa.repository.JpaRepository;
/**
 * Created by PengChao on 2016/12/1.
 */
public interface PersonRepository extends JpaRepository<Person, Long> {
    NoAddress findByFirstName(String firstName);
}

返回結(jié)果只包含firstName和lastName兩個(gè)屬性



 

spring data jpa查詢部分字段、多余附加字段

spring data jpa查詢部分字段

第一種方法:使用 model 查詢時(shí)轉(zhuǎn)化

首先建立一個(gè) model ,寫上自己想要查詢的字段,然后寫上構(gòu)造函數(shù),這步很重要,因?yàn)閟pring jpa 轉(zhuǎn)化時(shí)會(huì)調(diào)用這個(gè)構(gòu)造方法

public class MyModel implements Serializable {
? ? private String userName;
? ? private String name;
? ? private String gender;
? ? private String description;
? ? public MyModel() {};
? ? public MyModel(String userName, String name, String gender, String description) {
? ? ? ? this.userName = userName;
? ? ? ? this.name = name;
? ? ? ? this.gender = gender;
? ? ? ? this.description = description;
? ? }
}

然后在 dao 類中寫查詢方法

@Query(value = "select new pers.zhuch.model.MyModel(u.userName, ui.name, ui.gender, ui.description) from UserInfo ui, User u where u.id = ui.userId")
public List<MyModel> getAllRecord();

直接在查詢語句中 new model 框架底層會(huì)調(diào)用它,然后返回這個(gè)對象(這里我寫了完整的類路徑,不寫的時(shí)候它報(bào)錯(cuò)說找不到類型什么的)

然后就可以獲得只有指定字段的 model 了。然后就把它轉(zhuǎn)成 JSON 格式就 O 了。

第二種方法:在service 里邊轉(zhuǎn)換成 JSON

原理其實(shí)和第一種方法差不多,只是處理結(jié)果的方式不太一樣,只是這種方法我們就不在 hql 中 new Model 了,直接寫查詢方法

@Query(value = "select new map(u.userName, ui.name, ui.gender, ui.description) from UserInfo ui, User u where u.id = ui.userId")
public List<Map<String, Object>> getCustomField();

直接new map(這里得是小寫,不知道大寫有木有問題,反正沒試,編譯器提示是要小寫的) 

然后返回的結(jié)果是這樣的

[
    {
        "0": "admin", 
        "1": "你猜", 
        "2": "男", 
        "3": "一段描述"
    }, {
        "0": "abc", 
        "1": "你猜人家", 
        "2": "女", 
        "3": "沒事先掛了"
    }
]

注:多表聯(lián)合查詢附加額外字段,亦可使用此方法。例如

@Query("select new map(u as user,'hello' as ext) ?from User u where u.id=?1")
? ? List<Map<String,Object>> findExtTest(Long id);
? ? @Query(value="select u.*,'hello' as ext from user u where u.id=?1",nativeQuery = true)
? ? List<Object> findExtNativeTest(Long id);
?List<Map<String,Object>> rows = userRepository.findExtTest(10001l);
? ? ? ? for(Map<String,Object> row :rows) {
? ? ? ? ? ? User user = (User) row.get("user");
? ? ? ? ? ? String ext = (String) row.get("ext");
? ? ? ? ? ? System.out.println(user);
? ? ? ? ? ? System.out.println(ext);
? ? ? ? }
? ? ? ? List<Object> objects = userRepository.findExtNativeTest(10001l);
? ? ? ? for(Object obj :objects) {
? ? ? ? ? ? Object[] row = (Object[])obj;
? ? ? ? ? ? Long id = ((BigInteger) row[0]).longValue();
? ? ? ? ? ? String nickName = (String)row[17]; //數(shù)據(jù)庫字段順序
? ? ? ? ? ? String ext = (String) row[row.length-1];
? ? ? ? ? ? System.out.println(id);
? ? ? ? ? ? System.out.println(nickName);
? ? ? ? ? ? System.out.println(ext);
? ? ? ? }

第三種方法:select語句部分字段使用默認(rèn)值

@Query(value = "select u.user_name, ui.name, ui.gender,ui.description,'' as headImg from user_info u where u.id = 1",nativeQuery=true)
public List<User> getAllRecord();

相關(guān)文章

  • SpringBoot的攔截器中依賴注入為null的解決方法

    SpringBoot的攔截器中依賴注入為null的解決方法

    這篇文章主要介紹了SpringBoot的攔截器中依賴注入為null的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • SpringBoot采用AJAX實(shí)現(xiàn)異步發(fā)布帖子詳解

    SpringBoot采用AJAX實(shí)現(xiàn)異步發(fā)布帖子詳解

    Ajax是一種web應(yīng)用技術(shù),可以借助客戶端腳本(javascript)與服務(wù)端應(yīng)用進(jìn)行異步通訊,獲取服務(wù)端數(shù)據(jù)以后,可以進(jìn)行局部刷新,進(jìn)而提高數(shù)據(jù)的響應(yīng)和渲染速度。所有的Ajax請求都會(huì)基于DOM(HTML元素)事件,通過XHR(XMLHttpRequest)對象實(shí)現(xiàn)與服務(wù)端異步通訊局部更新
    2022-08-08
  • 在Jpa框架下拼接原生sql 并執(zhí)行的操作

    在Jpa框架下拼接原生sql 并執(zhí)行的操作

    這篇文章主要介紹了在Jpa框架下拼接原生sql 并執(zhí)行的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 詳解Java編程中對線程的中斷處理

    詳解Java編程中對線程的中斷處理

    這篇文章主要介紹了Java編程中對線程的中斷處理,特別講解了中斷的時(shí)機(jī)與中斷狀態(tài)的管理,需要的朋友可以參考下
    2015-11-11
  • Java如何在List或Map遍歷過程中刪除元素

    Java如何在List或Map遍歷過程中刪除元素

    相信大家在日常的開發(fā)過程中,經(jīng)常需要對List或Map里面的符合某種業(yè)務(wù)的數(shù)據(jù)進(jìn)行刪除,但是如果不了解里面的機(jī)制就容易掉入“陷阱”導(dǎo)致遺漏或者程序異常。下面這篇文章將會(huì)給大家詳細(xì)介紹Java如何在List和Map遍歷過程中刪除元素,有需要的朋友們可以參考借鑒。
    2016-12-12
  • SpringBoot超詳細(xì)講解Thymeleaf模板引擎

    SpringBoot超詳細(xì)講解Thymeleaf模板引擎

    這篇文章主要分享了Spring Boot整合使用Thymeleaf,Thymeleaf是新一代的Java模板引擎,類似于Velocity、FreeMarker等傳統(tǒng)引擎,關(guān)于其更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下
    2022-07-07
  • spring boot攔截器的使用場景示例詳解

    spring boot攔截器的使用場景示例詳解

    這篇文章主要給大家介紹了關(guān)于spring boot攔截器的使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 基于指針pointers和引用references的區(qū)別分析

    基于指針pointers和引用references的區(qū)別分析

    本篇文章介紹了,基于指針pointers和引用references的區(qū)別分析。需要的朋友參考下
    2013-05-05
  • SpringBoot項(xiàng)目攔截器獲取Post方法的請求body實(shí)現(xiàn)

    SpringBoot項(xiàng)目攔截器獲取Post方法的請求body實(shí)現(xiàn)

    本文主要介紹了SpringBoot項(xiàng)目攔截器獲取Post方法的請求body,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring 4.1+JSONP的使用指南

    Spring 4.1+JSONP的使用指南

    在解釋JSONP之前,我們需要了解下”同源策略“,這對理解跨域有幫助?;诎踩脑?瀏覽器是存在同源策略機(jī)制的,同源策略阻止從一個(gè)源加載的文檔或腳本獲取或設(shè)置另一個(gè)源加載額文檔的屬性。說的簡單點(diǎn)就是瀏覽器限制腳本只能和同協(xié)議、同域名、同端口的腳本進(jìn)行交互。
    2016-04-04

最新評論