說老實話,Spring Data JPA很好用,上次使用還是2013年,當時只是完成Java Bean和數據庫中表的映射。
最近想起來用Spring Data JPA的起因是手頭有一個項目,源代碼是用原生SQL+JDBC實現的,在第一次部署時要初始化數據庫,還hardcode了很多數據庫配置參數。正好最近有空,就打算用Spring Boot Data JPA(spring-boot-starter-data-jpa)改造一下,仔細看了一下源代碼發現和幾年前已經天差地別,如果你的業務邏輯不是特別復雜或者表結構設計合理,一行真正SQL邏輯實現都不要寫,良心啊,真是為我這樣的懶人着想啊。
首先開始寫Repository,常見的用法有兩種,一個是寫一個接口繼承JpaRepository,代碼如下:
package com.company.inventory.repository;
另外一個是繼承CrudRepository,代碼如下:
package com.company.inventory.repository;
JpaRepository和CrudRepository關系如下:
public interface CrudRepository<T, ID> extends Repository<T, ID>
從上面的關系就能看出JpaRepository除了能做CrudRepository能做的所有事外,還多了分頁和排序功能以及QueryByExampleExecutor提供的QueryByExample功能。但是JpaRepository也和JPA持久化技術進行了綁定。http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
所以建議盡量使用CrudRepository或者PagingAndSortingRepository
Supported keywords inside method names
| Keyword
|
Sample
|
JPQL snippet
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
接下來是定義Entity,遇到了第一個坑,代碼如下:
}
第一個坑,該類必須是實體類,不能繼承於任何基類,除非其中的參數不需要映射到數據庫中。
public class BaseModel{
protected String name;
//set, get方法忽略
}
public class Person extends BaseModel implements Serializable{
private Long id;
}
name將不能映射到數據庫中。
第二個坑,如果Field類似gmtCreated,有大寫字母的,默認映射到數據庫字段名會變為gmt_created。如果你的設計不是這樣,而是直接映射不做修改。需要在application.properties中指定Naming strategy,否則默認是org.hibernate.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy,在進行領域映射時,首字母小寫,大寫字母變為下划線加小寫。添加代碼如下:
spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
第三個坑,如果使用like,代碼如下:
其中的key,必須是類似%abc%,而不是'%abc%'。
'
