您好,登錄后才能下訂單哦!
本文介紹了Spring Data JPA系列之投影(Projection)的用法,分享給大家
在JPA的查詢中,有一個不方便的地方,@Query注解,如果查詢直接是
Select C from Customer c
,這時候,查詢的返回對象就是Customer這個完整的對象,包含所有字段,對于我們的示例并沒有什么問題,但是對于比較龐大的domain類,這個查詢時就比較要命,并不是所有的字段都能用到,比較頭疼。另外,如果定義
select c.firstName as firstName,c.lastName as lastName from Customer c
這個查詢結果,返回的對象是Object類型,而且無法直接轉換成Customer對象,這樣用起來就不是很方便。
對于這種情況,JPA提供了一種聲明方式來解決,即聲明一個接口類,然后直接使用這個接口類接受返回的數據即可。下面奉上代碼:
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(); }
這里聲明的方式是可以直接通過get+屬性名,這是普通的,另外也可以通過@Value注解來實現指定字段,除了指定字段也可以做聚合展示,比如有些地方需要展示客戶的全名,這里定義的getFullName()方法及注解@Value即完成這一操作。需要注意這里的@Value中的target表達式寫法及拼接方法。
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()); } }
這里只是做了簡單示意,深入的內容需要自己去挖掘探索。不過關于Projection的資料比較少,我也是扒了不少資料才理解的差不多了,還需要多多實踐。
另外spring-data-examples項目中有一些JPA的例子,可以用來學習,梳理思路。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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。