spring-data-jpa快速入門(二)——簡單查詢
阿新 • • 發佈:2018-02-11
ref spa data mail domain event cif open 寫實
一、方法名解析
1.引言
回顧HelloWorld項目中的dao接口
public interface GirlRepository extends JpaRepository<Girl, Integer>{
// 新增自定義查詢方法
List<Girl> findByAge(Integer age);
}
可以看到,這個接口中我們只是聲明了方法而沒有寫實現,但是卻是能用的,這便得益於JPA的方法名解析了
2.簡單條件查詢
按照 Spring Data 的規範,查詢方法以 find | read | get 開頭
涉及條件查詢時,條件的屬性用條件關鍵字連接,要註意的是:條件屬性以首字母大寫
常用的關鍵字如下:
And --- 等價於 SQL 中的 and 關鍵字,比如 findByUsernameAndPassword(String user, Striang pwd);
Or --- 等價於 SQL 中的 or 關鍵字,比如 findByUsernameOrAddress(String user, String addr);
Between --- 等價於 SQL 中的 between 關鍵字,比如 findBySalaryBetween(int max, int min);
LessThan --- 等價於 SQL 中的 "<",比如 findBySalaryLessThan(int max);
GreaterThan --- 等價於 SQL 中的">",比如 findBySalaryGreaterThan(int min);
IsNull --- 等價於 SQL 中的 "is null",比如 findByUsernameIsNull();
IsNotNull --- 等價於 SQL 中的 "is not null",比如 findByUsernameIsNotNull();
NotNull --- 與 IsNotNull 等價;
Like --- 等價於 SQL 中的 "like",比如 findByUsernameLike(String user);
StartingWith
NotLike --- 等價於 SQL 中的 "not like",比如 findByUsernameNotLike(String user);
OrderBy --- 等價於 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);
Not --- 等價於 SQL 中的 "! =",比如 findByUsernameNot(String user);
In --- 等價於 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的參數可以是 Collection 類型,也可以是數組或者不定長參數;
NotIn --- 等價於 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的參數可以是 Collection 類型,也可以是數組或者不定長參數;
完整關鍵字支持,查看官方文檔:點擊查看
IDEA對這方面支持非常友好!寫方法解析時自動有智能提示!
示例:
List<Girl> findByNameStartingWithAndIdLessThan(String name, Integer id);
/** * 1. Repository 是一個空接口. 即是一個標記接口 * 2. 若我們定義的接口繼承了 Repository, 則該接口會被 IOC 容器識別為一個 Repository Bean. * 納入到 IOC 容器中. 進而可以在該接口中定義滿足一定規範的方法. * * 3. 實際上, 也可以通過 @RepositoryDefinition 註解來替代繼承 Repository 接口 */ /** * 在 Repository 子接口中聲明方法 * 1. 不是隨便聲明的. 而需要符合一定的規範 * 2. 查詢方法以 find | read | get 開頭 * 3. 涉及條件查詢時,條件的屬性用條件關鍵字連接 * 4. 要註意的是:條件屬性以首字母大寫。 * 5. 支持屬性的級聯查詢. 若當前類有符合條件的屬性, 則優先使用, 而不使用級聯屬性. * 若需要使用級聯屬性, 則屬性之間使用 _ 進行連接. */ //@RepositoryDefinition(domainClass=Person.class,idClass=Integer.class) public interface PersonRepsotory extends JpaRepository<Person, Integer>, JpaSpecificationExecutor<Person>, PersonDao{ //根據 lastName 來獲取對應的 Person Person getByLastName(String lastName); //WHERE lastName LIKE ?% AND id < ? List<Person> getByLastNameStartingWithAndIdLessThan(String lastName, Integer id); //WHERE lastName LIKE %? AND id < ? List<Person> getByLastNameEndingWithAndIdLessThan(String lastName, Integer id); //WHERE email IN (?, ?, ?) OR birth < ? List<Person> getByEmailInAndBirthLessThan(List<String> emails, Date birth); //WHERE a.id > ? List<Person> getByAddress_IdGreaterThan(Integer id);更多示例
其他的關鍵字也是類似,可以在控制臺看到打印的SQL(配置了show sql)
當然,缺點非常明顯,方法名特別特別長!這個後期會通過JPQL進行改進!
二、自定義查詢
例如帶子查詢的就無法實現,這裏就需要自定義SQL來進行查詢了!
參考:https://www.cnblogs.com/zj0208/p/6008627.html
spring-data-jpa快速入門(二)——簡單查詢