天天看點

關于Spring-Data-Jpa的一些了解

JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它為Java開發人員提供了一種對象/關聯映射工具來管理Java應用中的關系資料。他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink,JDO等ORM架構各自為營的局面。值得注意的是,JPA是在充分吸收了現有Hibernate,TopLink,JDO等ORM架構的基礎上發展而來的,具有易于使用,伸縮性強等優點。從目前的開發社群的反應上看,JPA受到了極大的支援和贊揚,其中就包括了Spring與EJB3.0的開發團隊。

注意:JPA是一套規範,不是一套産品,那麼像Hibernate,TopLink,JDO他們是一套産品,如果說這些産品實作了這個JPA規範,那麼我們就可以叫他們為JPA的實作産品。

Spring Data JPA 是 Spring 基于 ORM 架構、JPA 規範的基礎上封裝的一套JPA應用架構,可使開發者用極簡的代碼即可實作對資料的通路和操作。它提供了包括增删改查等在内的常用功能,且易于擴充!學習并使用 Spring Data JPA 可以極大提高開發效率!

spring data jpa讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴于它來實作

基本查詢也分為兩種,一種是spring data預設已經實作,一種是根據查詢的方法來自動解析成SQL。

spring data jpa 預設預先生成了一些基本的CURD的方法,例如:增、删、改等等

1 繼承JpaRepository

2 使用預設方法

就不解釋了根據方法名就看出意思來

自定義的簡單查詢就是根據方法名來自動生成SQL,主要的文法是<code>findXXBy</code>,<code>readAXXBy</code>,<code>queryXXBy</code>,<code>countXXBy</code>, <code>getXXBy</code>後面跟屬性名稱:

也使用一些加一些關鍵字<code>And</code>、 <code>Or</code>

修改、删除、統計也是類似文法

基本上SQL體系中的關鍵詞都可以使用,例如:<code>LIKE</code>、 <code>IgnoreCase</code>、 <code>OrderBy</code>。

具體的關鍵字,使用方法和生産成SQL如下表所示

Keyword

Sample

JPQL snippet

And

findByLastnameAndFirstname

… where x.lastname = ?1 and x.firstname = ?2

Or

findByLastnameOrFirstname

… where x.lastname = ?1 or x.firstname = ?2

Is,Equals

findByFirstnameIs,findByFirstnameEquals

… where x.firstname = ?1

Between

findByStartDateBetween

… where x.startDate between ?1 and ?2

LessThan

findByAgeLessThan

… where x.age &lt; ?1

LessThanEqual

findByAgeLessThanEqual

… where x.age ⇐ ?1

GreaterThan

findByAgeGreaterThan

… where x.age &gt; ?1

GreaterThanEqual

findByAgeGreaterThanEqual

… where x.age &gt;= ?1

After

findByStartDateAfter

… where x.startDate &gt; ?1

Before

findByStartDateBefore

… where x.startDate &lt; ?1

IsNull

findByAgeIsNull

… where x.age is null

IsNotNull,NotNull

findByAge(Is)NotNull

… where x.age not null

Like

findByFirstnameLike

… where x.firstname like ?1

NotLike

findByFirstnameNotLike

… where x.firstname not like ?1

StartingWith

findByFirstnameStartingWith

… where x.firstname like ?1 (parameter bound with appended %)

EndingWith

findByFirstnameEndingWith

… where x.firstname like ?1 (parameter bound with prepended %)

Containing

findByFirstnameContaining

… where x.firstname like ?1 (parameter bound wrapped in %)

OrderBy

findByAgeOrderByLastnameDesc

… where x.age = ?1 order by x.lastname desc

Not

findByLastnameNot

… where x.lastname &lt;&gt; ?1

In

findByAgeIn(Collection ages)

… where x.age in ?1

NotIn

findByAgeNotIn(Collection age)

… where x.age not in ?1

TRUE

findByActiveTrue()

… where x.active = true

FALSE

findByActiveFalse()

… where x.active = false

IgnoreCase

findByFirstnameIgnoreCase

… where UPPER(x.firstame) = UPPER(?1)

在實際的開發中我們需要用到分頁、删選、連表等查詢的時候就需要特殊的方法或者自定義SQL

分頁查詢在實際使用中非常普遍了,spring data jpa已經幫我們實作了分頁的功能,在查詢的方法中,需要傳入參數<code>Pageable</code> ,當查詢中有多個參數的時候<code>Pageable</code>建議做為最後一個參數傳入

<code>Pageable</code> 是spring封裝的分頁實作類,使用的時候需要傳入頁數、每頁條數和排序規則

限制查詢

有時候我們隻需要查詢前N個元素,或者支取前一個實體。

其實Spring data 覺大部分的SQL都可以根據方法名定義的方式來實作,但是由于某些原因我們想使用自定義的SQL來查詢,spring data也是完美支援的;

在SQL的查詢方法上面使用<code>@Query</code>注解,如涉及到删除和修改在需要加上<code>@Modifying</code>.也可以根據需要添加 <code>@Transactional</code> 對事物的支援,查詢逾時的設定等

多表查詢在spring data jpa中有兩種實作方式,第一種是利用hibernate的級聯查詢來實作,第二種是建立一個結果集的接口來接收連表查詢後的結果,這裡主要第二種方式。

首先需要定義一個結果集的接口類。

查詢的方法傳回類型設定為新建立的接口

使用

在運作中Spring會給接口(HotelSummary)自動生産一個代理類來接收傳回的結果,代碼彙總使用<code>getXX</code>的形式來擷取