spring?data?jpa查詢一個實體類的部分屬性方式
spring data jpa查詢一個實體類的部分屬性
使用Spring Data Repository查詢時候,通常情況下返回的是一個實體所有的屬性。但是在很多情況下,我們只需要實體類的部分屬性。下面的部分講述如何實現(xiàn)查詢一個實體類的部分屬性。
首先我們定義兩個實體類
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實體類的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"方法將會返回Person對象的所有屬性(包括address)

但實際情況我們不需要返回address對象,這種情況我們可以定義一個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實體類的repository中定義一個查詢方法,返回值是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兩個屬性

spring data jpa查詢部分字段、多余附加字段
spring data jpa查詢部分字段
第一種方法:使用 model 查詢時轉(zhuǎn)化
首先建立一個 model ,寫上自己想要查詢的字段,然后寫上構(gòu)造函數(shù),這步很重要,因為spring jpa 轉(zhuǎn)化時會調(diào)用這個構(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 框架底層會調(diào)用它,然后返回這個對象(這里我寫了完整的類路徑,不寫的時候它報錯說找不到類型什么的)
然后就可以獲得只有指定字段的 model 了。然后就把它轉(zhuǎn)成 JSON 格式就 O 了。
第二種方法:在service 里邊轉(zhuǎn)換成 JSON
原理其實和第一種方法差不多,只是處理結(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語句部分字段使用默認值
@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采用AJAX實現(xiàn)異步發(fā)布帖子詳解
Ajax是一種web應(yīng)用技術(shù),可以借助客戶端腳本(javascript)與服務(wù)端應(yīng)用進行異步通訊,獲取服務(wù)端數(shù)據(jù)以后,可以進行局部刷新,進而提高數(shù)據(jù)的響應(yīng)和渲染速度。所有的Ajax請求都會基于DOM(HTML元素)事件,通過XHR(XMLHttpRequest)對象實現(xiàn)與服務(wù)端異步通訊局部更新2022-08-08
基于指針pointers和引用references的區(qū)別分析
本篇文章介紹了,基于指針pointers和引用references的區(qū)別分析。需要的朋友參考下2013-05-05
SpringBoot項目攔截器獲取Post方法的請求body實現(xiàn)
本文主要介紹了SpringBoot項目攔截器獲取Post方法的請求body,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

