1. 程式人生 > >spring-data-jpa快速入門(二)——簡單查詢

spring-data-jpa快速入門(二)——簡單查詢

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快速入門(二)——簡單查詢