spring?data?jpa查詢(xún)一個(gè)實(shí)體類(lèi)的部分屬性方式
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代碼實(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),文中通過(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í)別,關(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求和以及自定義分組求和
這篇文章主要給大家介紹了關(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
使用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)的方法,本文講解了注意事項(xiàng)和調(diào)用語(yǔ)法,需要的朋友可以參考下2015-05-05

