SpringData?JPA的常用語法匯總
前言
SpringData JPA常用有兩種寫法,一個是用Jpa自帶方法進(jìn)行CRUD,適合簡單查詢場景、例如查詢?nèi)繑?shù)據(jù)、根據(jù)某個字段查詢,根據(jù)某字段排序等等。另一種是使用注解方式,@Query、@Modifying。
1.方法方式
方法說明
接口方法如下,方法作用見注釋:
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
// 無條件,查詢?nèi)坑涗?
List<T> findAll();
// 排序查詢
List<T> findAll(Sort var1);
// 根據(jù)主鍵ID查詢
List<T> findAllById(Iterable<ID> var1);
// 批量保存集合數(shù)據(jù)
<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實現(xiàn)JpaRepository接口,直接調(diào)用JpaRepository中的方法就可以實現(xiàn)了簡單查詢,例如查詢User實例列表:
// 構(gòu)建user的Example對象 Example<User> example =Example.of(User); List<User> users = userRepository.findAll(example);
2.注解方式
jpa實現(xiàn)CRUD的主要注解是@Query
注解說明
@Query注解主要有以下參數(shù),參數(shù)作用如下:
value:SQL語句countQuery: 分頁查詢時統(tǒng)計總數(shù)nativeQuery: 使用執(zhí)行這個方法的時候執(zhí)行原生sql語句,直接寫數(shù)據(jù)庫中的實際表名和表的實際字段名
@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。下面例子是根據(jù)task_id進(jìn)行分組查詢task集合
@Query(value = "select task_id from task group by task_id", nativeQuery = true) List<Task> queryByGroup();
- 使用注解方式排序
根據(jù)task_id進(jìn)行排序查詢task集合
@Query(value = "select task_id,task_date from task order by task_id", nativeQuery = true) List<Task> queryOrder();
- 使用注解方式條件查詢
條件查詢時可以使用字段名 操作符 ?;例如:task_date >= ?,使用位置匹配?。也可以使用字段名 操作符 :屬性名;例如:task_date >= :startDate,使用屬性名匹配,推薦使用后者,如果字段順序修改,不影響匹配結(jié)果。下面是根據(jù)任務(wù)時間(task_date)段內(nèi)和未被刪除(deleted)的任務(wù)
@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);- 使用注解方式修改
修改一條數(shù)據(jù)需要加上@Modifying用于標(biāo)識是修改操作,默認(rèn)事務(wù)等級是只讀,所以還需要加上@Transactional,這樣覆蓋了默認(rèn)的@Transactional才可以執(zhí)行修改操作。下面是根據(jù)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);多表聯(lián)查,且多條件、分頁查詢怎么寫?
復(fù)雜的查詢需要注意,以下使用一個Mysql的多表聯(lián)查的例子來說明復(fù)雜的查詢要怎么寫。下面是user表task表關(guān)聯(lián)查詢出任務(wù)名稱、任務(wù)ID、用戶名稱這些信息,并且根據(jù)task_name、task_date進(jìn)行過濾;根據(jù)task_date倒序。
共有幾點需要注意:
- 多表聯(lián)查使用正常的JOIN就可以
- 多條件是常見的情況,需要區(qū)別傳入的條件是否要去執(zhí)行,這種情況需要使用
where 1=1 and這種方式來保證條件不傳時仍然正常查詢。 - 分頁查詢需要傳入分頁參數(shù)
Pageable,并且寫countQuery來統(tǒng)計總數(shù)。 - 多條件查詢關(guān)鍵:
if(:參數(shù)!='',k.字段名 =:參數(shù),1=1),這里是使用了if進(jìn)行判斷,這個寫法類似Mybatis xml中的<if>標(biāo)簽。if的含義是代表傳入的參數(shù)如果不為""(Spring類型空是""而不是null)將參數(shù)傳入,如果為空時顯示1=1代表參數(shù)為真,對查詢結(jié)果不產(chǎn)生作用。
代碼:
@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);小結(jié)
以上列舉了兩種JPA的crud方式,jpa方法與注解方式,平時寫代碼時更傾向于使用注解方式去寫原生sql來實現(xiàn)業(yè)務(wù)。對于簡單查詢可以用JpaRepository里面這些方法就夠用了,對于更復(fù)雜的場景推薦使用@Query寫sql的方式來實現(xiàn)。
jpa方法可以屏蔽底層的sql,如果有不同數(shù)據(jù)庫實現(xiàn)的服務(wù),用jpa方法可以免于修改sql。但是jpa方法對于分組查詢、limit支持、多條件、多表聯(lián)查這些不太友好。
總結(jié)
到此這篇關(guān)于SpringData JPA常用語法的文章就介紹到這了,更多相關(guān)SpringData JPA常用語法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot數(shù)據(jù)訪問自定義使用Druid數(shù)據(jù)源的方法
本文記錄Druid數(shù)據(jù)源的使用,自定義實現(xiàn)Drud的功能、監(jiān)控頁、登錄、統(tǒng)計等。對SpringBoot數(shù)據(jù)訪問使用Druid數(shù)據(jù)源的相關(guān)知識感興趣額朋友一起看看吧2021-08-08
java中進(jìn)程與線程_三種實現(xiàn)方式總結(jié)(必看篇)
下面小編就為大家?guī)硪黄猨ava中進(jìn)程與線程_三種實現(xiàn)方式總結(jié)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
解決mybatis where-if中if不能識別大寫AND,OR的問題
這篇文章主要介紹了解決mybatis where-if中if不能識別大寫AND,OR的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02

