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

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

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

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

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

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

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í)體類(lèi)的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對(duì)象的所有屬性(包括address)


 

但實(shí)際情況我們不需要返回address對(duì)象,這種情況我們可以定義一個(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對(duì)象的firstName屬性,“3”輸出person對(duì)象的lastName屬性

最后在Person實(shí)體類(lèi)的repository中定義一個(gè)查詢(xún)方法,返回值是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查詢(xún)部分字段、多余附加字段

spring data jpa查詢(xún)部分字段

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

首先建立一個(gè) model ,寫(xiě)上自己想要查詢(xún)的字段,然后寫(xiě)上構(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 類(lèi)中寫(xiě)查詢(xún)方法

@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();

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

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

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

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

@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(這里得是小寫(xiě),不知道大寫(xiě)有木有問(wèn)題,反正沒(méi)試,編譯器提示是要小寫(xiě)的) 

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

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

注:多表聯(lián)合查詢(xú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ù)庫(kù)字段順序
? ? ? ? ? ? String ext = (String) row[row.length-1];
? ? ? ? ? ? System.out.println(id);
? ? ? ? ? ? System.out.println(nickName);
? ? ? ? ? ? System.out.println(ext);
? ? ? ? }

第三種方法:select語(yǔ)句部分字段使用默認(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)文章

  • 詳解Java編程中對(duì)象的序列化

    詳解Java編程中對(duì)象的序列化

    這篇文章主要介紹了Java編程中對(duì)象的序列化,包括一些反序列化的例子,需要的朋友可以參考下
    2015-11-11
  • Java代碼實(shí)現(xiàn)隨機(jī)生成漢字的方法

    Java代碼實(shí)現(xiàn)隨機(jī)生成漢字的方法

    今天小編就為大家分享一篇關(guān)于Java代碼實(shí)現(xiàn)隨機(jī)生成漢字的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • springboot項(xiàng)目使用Disruptor做內(nèi)部消息隊(duì)列的實(shí)現(xiàn)

    springboot項(xiàng)目使用Disruptor做內(nèi)部消息隊(duì)列的實(shí)現(xiàn)

    本文主要介紹了springboot項(xiàng)目使用Disruptor做內(nèi)部消息隊(duì)列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Spring AOP與代理類(lèi)的執(zhí)行順序級(jí)別淺析

    Spring AOP與代理類(lèi)的執(zhí)行順序級(jí)別淺析

    這篇文章主要介紹了Spring AOP與代理類(lèi)的執(zhí)行順序級(jí)別,關(guān)于 Spring AOP和Aspectj的關(guān)系,兩個(gè)都實(shí)現(xiàn)了切面編程,Spring AOP更多地是為了Spring框架本身服務(wù)的,而Aspectj具有更強(qiáng)大、更完善的切面功能
    2023-03-03
  • java?stream實(shí)現(xiàn)分組BigDecimal求和以及自定義分組求和

    java?stream實(shí)現(xiàn)分組BigDecimal求和以及自定義分組求和

    這篇文章主要給大家介紹了關(guān)于java?stream實(shí)現(xiàn)分組BigDecimal求和以及自定義分組求和的相關(guān)資料,Stream是Java8的一大亮點(diǎn),是對(duì)容器對(duì)象功能的增強(qiáng),它專(zhuān)注于對(duì)容器對(duì)象進(jìn)行各種非常便利、高效的聚合操作或者大批量數(shù)據(jù)操作,需要的朋友可以參考下
    2023-12-12
  • 一個(gè)@Component注解引發(fā)的大坑

    一個(gè)@Component注解引發(fā)的大坑

    這篇文章主要介紹了一個(gè)@Component注解引發(fā)的大坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 使用C3P0改造JDBC對(duì)數(shù)據(jù)庫(kù)的連接

    使用C3P0改造JDBC對(duì)數(shù)據(jù)庫(kù)的連接

    這篇文章主要為大家詳細(xì)介紹了使用C3P0改造JDBC對(duì)數(shù)據(jù)庫(kù)的連接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • kettle中使用js調(diào)用java類(lèi)的方法

    kettle中使用js調(diào)用java類(lèi)的方法

    這篇文章主要介紹了kettle中使用js調(diào)用java類(lèi)的方法,本文講解了注意事項(xiàng)和調(diào)用語(yǔ)法,需要的朋友可以參考下
    2015-05-05
  • Java如何有效避免SQL注入漏洞的方法總結(jié)

    Java如何有效避免SQL注入漏洞的方法總結(jié)

    SQL注入是比較常見(jiàn)的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來(lái)實(shí)現(xiàn)攻擊,而是針對(duì)程序員編程時(shí)的疏忽,通過(guò)SQL語(yǔ)句,實(shí)現(xiàn)無(wú)帳號(hào)登錄,甚至篡改數(shù)據(jù)庫(kù),這篇文章主要給大家介紹了關(guān)于Java如何避免SQL注入漏洞的兩種方法,需要的朋友可以參考下
    2022-01-01
  • 詳解Spring容器的使用流程

    詳解Spring容器的使用流程

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Spring容器的使用流程展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

常德市| 五河县| 安图县| 张家口市| 交口县| 墨竹工卡县| 特克斯县| 陕西省| 永川市| 沁源县| 稻城县| 遂平县| 宜宾市| 清流县| 济宁市| 五常市| 光泽县| 清流县| 高青县| 全南县| 偃师市| 长宁县| 赤壁市| 丹棱县| 新宁县| 铁岭市| 金昌市| 含山县| 南开区| 梓潼县| 北安市| 瓮安县| 柏乡县| 孙吴县| 武陟县| 石狮市| 临桂县| 永年县| 图们市| 福清市| 九江县|