您好,登錄后才能下訂單哦!
今天小編給大家分享一下SpringData JPA的常用語法有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
SpringData JPA常用有兩種寫法,一個是用Jpa自帶方法進行CRUD
,適合簡單查詢場景、例如查詢全部數據、根據某個字段查詢,根據某字段排序等等。另一種是使用注解方式,@Query
、@Modifying
。
接口方法如下,方法作用見注釋:
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { // 無條件,查詢全部記錄 List<T> findAll(); // 排序查詢 List<T> findAll(Sort var1); // 根據主鍵ID查詢 List<T> findAllById(Iterable<ID> var1); // 批量保存集合數據 <S extends T> List<S> saveAll(Iterable<S> var1); void flush(); <S extends T> S saveAndFlush(S var1); // 批量刪除 void deleteInBatch(Iterable<T> var1); // all in 全部刪除 void deleteAllInBatch(); // 查詢一條記錄 T getOne(ID var1); // 條件查詢 <S extends T> List<S> findAll(Example<S> var1); // 條件查詢,帶排序 <S extends T> List<S> findAll(Example<S> var1, Sort var2); }
一般dao實現JpaRepository接口,直接調用JpaRepository中的方法就可以實現了簡單查詢,例如查詢User實例列表:
// 構建user的Example對象 Example<User> example =Example.of(User); List<User> users = userRepository.findAll(example);
jpa實現CRUD的主要注解是@Query
@Query
注解主要有以下參數,參數作用如下:
value
:SQL語句
countQuery
: 分頁查詢時統計總數
nativeQuery
: 使用執行這個方法的時候執行原生sql語句,直接寫數據庫中的實際表名
和表的實際字段名
@Query
的代碼如下:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @QueryAnnotation @Documented public @interface Query { String value() default ""; String countQuery() default ""; String countProjection() default ""; boolean nativeQuery() default false; String name() default ""; String countName() default ""; }
使用注解方式分組查詢
跟正常寫sql語句相同,將sql寫到value中,并且nativeQuery = true
。下面例子是根據task_id
進行分組查詢task
集合
@Query(value = "select task_id from task group by task_id", nativeQuery = true) List<Task> queryByGroup();
使用注解方式排序
根據task_id
進行排序查詢task
集合
@Query(value = "select task_id,task_date from task order by task_id", nativeQuery = true) List<Task> queryOrder();
使用注解方式條件查詢
條件查詢時可以使用字段名 操作符 ?
;例如:task_date >= ?
,使用位置匹配?
。也可以使用字段名 操作符 :屬性名
;例如:task_date >= :startDate
,使用屬性名匹配,推薦使用后者,如果字段順序修改,不影響匹配結果。下面是根據任務時間(task_date
)段內和未被刪除(deleted
)的任務
@Query(value = "select task_id,task_date from task where task_date >=? and task_date <=? and deleted=0 ", nativeQuery = true) List<ApptTask> queryDate(@Param("startDate") String startDate, @Param("endDate") String endDate);
使用注解方式修改
修改一條數據需要加上@Modifying
用于標識是修改操作,默認事務等級是只讀,所以還需要加上@Transactional
,這樣覆蓋了默認的@Transactional
才可以執行修改操作。下面是根據task_id
更新task
表的備注信息
@Transactional(rollbackOn = Exception.class) @Modifying @Query(value = "update task set remark = ? where task_id=?", nativeQuery = true) void updateRemark(@Param("remark") String remark, @Param("taskId") String taskId);
復雜的查詢需要注意,以下使用一個Mysql的多表聯查的例子來說明復雜的查詢要怎么寫。下面是user
表task
表關聯查詢出任務名稱、任務ID、用戶名稱這些信息,并且根據task_name
、task_date
進行過濾;根據task_date
倒序。
共有幾點需要注意:
多表聯查使用正常的JOIN就可以
多條件是常見的情況,需要區別傳入的條件是否要去執行,這種情況需要使用where 1=1 and
這種方式來保證條件不傳時仍然正常查詢。
分頁查詢需要傳入分頁參數Pageable
,并且寫countQuery
來統計總數。
多條件查詢關鍵:if(:參數!='',k.字段名 =:參數,1=1)
,這里是使用了if
進行判斷,這個寫法類似Mybatis xml中的<if>
標簽。if
的含義是代表傳入的參數如果不為""(Spring類型空是""而不是null)將參數傳入,如果為空時顯示1=1
代表參數為真,對查詢結果不產生作用。
代碼:
@Query(value = " select a.task_name, a.task_id,u.user_name" + " from task a " + " LEFT JOIN usert u" + " ON a.user_id = u.user_id" + " where a.deleted=0 " + " AND if(:taskName!='',a.task_name =:taskName,1=1)" + " AND if(:startDate!='',a.task_date >=:startDate,1=1)" + " AND if(:endDate!='',a.task_date <=:endDate,1=1)" + " order by a.task_date desc" , nativeQuery = true , countQuery = " select count(*)" + " from task a " + " LEFT JOIN usert u" + " ON a.user_id = u.user_id" + " where a.deleted=0 " + " AND if(:taskName!='',a.task_name =:taskName,1=1)" + " AND if(:startDate!='',a.task_date >=:startDate,1=1)" + " AND if(:endDate!='',a.task_date <=:endDate,1=1)" + " order by a.task_date desc") Page<Map<String,Object>> queryUserTaskPage(@Param("taskName") String taskName, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate, @Param("pageable") Pageable pageable);
以上就是“SpringData JPA的常用語法有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。