詳解Spring Data JPA系列之投影(Projection)的用法
本文介紹了Spring Data JPA系列之投影(Projection)的用法,分享給大家
在JPA的查詢中,有一個(gè)不方便的地方,@Query注解,如果查詢直接是
Select C from Customer c
,這時(shí)候,查詢的返回對(duì)象就是Customer這個(gè)完整的對(duì)象,包含所有字段,對(duì)于我們的示例并沒有什么問(wèn)題,但是對(duì)于比較龐大的domain類,這個(gè)查詢時(shí)就比較要命,并不是所有的字段都能用到,比較頭疼。另外,如果定義
select c.firstName as firstName,c.lastName as lastName from Customer c
這個(gè)查詢結(jié)果,返回的對(duì)象是Object類型,而且無(wú)法直接轉(zhuǎn)換成Customer對(duì)象,這樣用起來(lái)就不是很方便。
對(duì)于這種情況,JPA提供了一種聲明方式來(lái)解決,即聲明一個(gè)接口類,然后直接使用這個(gè)接口類接受返回的數(shù)據(jù)即可。下面奉上代碼:
1、增加CustomerProjection接口類
package com.example.demo.dto; import org.springframework.beans.factory.annotation.Value; /** * Created by Administrator on 2017/7/9 0009. */ public interface CustomerProjection { @Value("#{target.firstName + ' ' + target.lastName}") String getFullName(); String getFirstName(); String getLastName(); }
這里聲明的方式是可以直接通過(guò)get+屬性名,這是普通的,另外也可以通過(guò)@Value注解來(lái)實(shí)現(xiàn)指定字段,除了指定字段也可以做聚合展示,比如有些地方需要展示客戶的全名,這里定義的getFullName()方法及注解@Value即完成這一操作。需要注意這里的@Value中的target表達(dá)式寫法及拼接方法。
2、增加CustomerRepository方法
@Query("SELECT c.firstName as firstName,c.lastName as lastName from Customer c") Collection<CustomerProjection> findAllProjectedBy();
3、增加CustomerController方法
/** * find by projections */ @RequestMapping("/findAllProjections") public void findAllProjections(){ Collection<CustomerProjection> projections = repository.findAllProjectedBy(); System.out.println(projections); System.out.println(projections.size()); for (CustomerProjection projection:projections){ System.out.println("FullName:"+projection.getFullName()); System.out.println("FirstName:"+projection.getFirstName()); System.out.println("LastName:"+projection.getLastName()); } }
這里只是做了簡(jiǎn)單示意,深入的內(nèi)容需要自己去挖掘探索。不過(guò)關(guān)于Projection的資料比較少,我也是扒了不少資料才理解的差不多了,還需要多多實(shí)踐。
另外spring-data-examples項(xiàng)目中有一些JPA的例子,可以用來(lái)學(xué)習(xí),梳理思路。https://github.com/spring-projects/spring-data-examples/tree/master/jpa
參考:
官方文檔,http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
DEMO,https://github.com/icnws/spring-data-jpa-demo
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java定義隊(duì)列結(jié)構(gòu),并實(shí)現(xiàn)入隊(duì)、出隊(duì)操作完整示例
這篇文章主要介紹了Java定義隊(duì)列結(jié)構(gòu),并實(shí)現(xiàn)入隊(duì)、出隊(duì)操作,結(jié)合完整實(shí)例形式分析了java數(shù)據(jù)結(jié)構(gòu)中隊(duì)列的定義、入隊(duì)、出隊(duì)、判斷隊(duì)列是否為空、打印隊(duì)列元素等相關(guān)操作技巧,需要的朋友可以參考下2020-02-02springboot自動(dòng)掃描添加的BeanDefinition源碼實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于springboot自動(dòng)掃描添加的BeanDefinition的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02SpringBoot Application事件監(jiān)聽的實(shí)現(xiàn)方案
這篇文章主要介紹了SpringBoot Application事件監(jiān)聽的實(shí)現(xiàn)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05navicatdesignquery.sql.bak系統(tǒng)找不到指定路徑錯(cuò)誤的解決方法
今天小編就為大家分享一篇關(guān)于navicatdesignquery.sql.bak系統(tǒng)找不到指定路徑錯(cuò)誤的解決方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Java使用fastjson對(duì)String、JSONObject、JSONArray相互轉(zhuǎn)換
這篇文章主要介紹了Java使用fastjson對(duì)String、JSONObject、JSONArray相互轉(zhuǎn)換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11關(guān)于nacos無(wú)法正常下線問(wèn)題記錄
這篇文章主要介紹了關(guān)于nacos無(wú)法正常下線問(wèn)題記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07