最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringData?JPA的常用語法匯總

 更新時(shí)間:2022年06月08日 16:14:30   作者:斗笠小熊貓  
Spring Data JPA是Spring基于ORM框架、JPA規(guī)范的基礎(chǔ)上封裝的一套JPA應(yīng)用框架,可使開發(fā)者用極簡的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問和操作,下面這篇文章主要給大家介紹了關(guān)于SpringData?JPA的常用語法,需要的朋友可以參考下

前言

SpringData JPA常用有兩種寫法,一個(gè)是用Jpa自帶方法進(jìn)行CRUD,適合簡單查詢場(chǎng)景、例如查詢?nèi)繑?shù)據(jù)、根據(jù)某個(gè)字段查詢,根據(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實(shí)現(xiàn)JpaRepository接口,直接調(diào)用JpaRepository中的方法就可以實(shí)現(xiàn)了簡單查詢,例如查詢User實(shí)例列表:

// 構(gòu)建user的Example對(duì)象
Example<User> example =Example.of(User);
List<User> users = userRepository.findAll(example);

2.注解方式

jpa實(shí)現(xiàn)CRUD的主要注解是@Query

注解說明

@Query注解主要有以下參數(shù),參數(shù)作用如下:

  • value:SQL語句
  • countQuery: 分頁查詢時(shí)統(tǒng)計(jì)總數(shù)
  • nativeQuery: 使用執(zhí)行這個(gè)方法的時(shí)候執(zhí)行原生sql語句,直接寫數(shù)據(jù)庫中的實(shí)際表名和表的實(shí)際字段名

@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();
  • 使用注解方式條件查詢

條件查詢時(shí)可以使用字段名 操作符 ?;例如:task_date >= ?,使用位置匹配?。也可以使用字段名 操作符 :屬性名;例如:task_date >= :startDate,使用屬性名匹配,推薦使用后者,如果字段順序修改,不影響匹配結(jié)果。下面是根據(jù)任務(wù)時(shí)間(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)識(shí)是修改操作,默認(rèn)事務(wù)等級(jí)是只讀,所以還需要加上@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)查,且多條件、分頁查詢?cè)趺磳懀?/h3>

復(fù)雜的查詢需要注意,以下使用一個(gè)Mysql的多表聯(lián)查的例子來說明復(fù)雜的查詢要怎么寫。下面是usertask表關(guān)聯(lián)查詢出任務(wù)名稱、任務(wù)ID、用戶名稱這些信息,并且根據(jù)task_nametask_date進(jìn)行過濾;根據(jù)task_date倒序。

共有幾點(diǎn)需要注意:

  • 多表聯(lián)查使用正常的JOIN就可以
  • 多條件是常見的情況,需要區(qū)別傳入的條件是否要去執(zhí)行,這種情況需要使用where 1=1 and 這種方式來保證條件不傳時(shí)仍然正常查詢。
  • 分頁查詢需要傳入分頁參數(shù)Pageable,并且寫countQuery來統(tǒng)計(jì)總數(shù)。
  • 多條件查詢關(guān)鍵:if(:參數(shù)!='',k.字段名 =:參數(shù),1=1),這里是使用了if進(jìn)行判斷,這個(gè)寫法類似Mybatis xml中的<if>標(biāo)簽。if的含義是代表傳入的參數(shù)如果不為""(Spring類型空是""而不是null)將參數(shù)傳入,如果為空時(shí)顯示1=1 代表參數(shù)為真,對(duì)查詢結(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方法與注解方式,平時(shí)寫代碼時(shí)更傾向于使用注解方式去寫原生sql來實(shí)現(xiàn)業(yè)務(wù)。對(duì)于簡單查詢可以用JpaRepository里面這些方法就夠用了,對(duì)于更復(fù)雜的場(chǎng)景推薦使用@Query寫sql的方式來實(shí)現(xiàn)。

jpa方法可以屏蔽底層的sql,如果有不同數(shù)據(jù)庫實(shí)現(xiàn)的服務(wù),用jpa方法可以免于修改sql。但是jpa方法對(duì)于分組查詢、limit支持、多條件、多表聯(lián)查這些不太友好。

總結(jié)

到此這篇關(guān)于SpringData JPA常用語法的文章就介紹到這了,更多相關(guān)SpringData JPA常用語法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring?boot?動(dòng)態(tài)生成接口實(shí)現(xiàn)類的場(chǎng)景分析

    spring?boot?動(dòng)態(tài)生成接口實(shí)現(xiàn)類的場(chǎng)景分析

    本文不具體介紹動(dòng)態(tài)代理,主要看一下它在springboot項(xiàng)目中的實(shí)際應(yīng)用,下面我們模仿feign來實(shí)現(xiàn)一個(gè)調(diào)用三方接口的?httpclient,感謝的朋友跟隨小編一起看看吧
    2021-11-11
  • Mybatis 多對(duì)一查詢的實(shí)現(xiàn)方法

    Mybatis 多對(duì)一查詢的實(shí)現(xiàn)方法

    這篇文章主要介紹了Mybatis 多對(duì)一查詢,本文通過場(chǎng)景分析示例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Java實(shí)現(xiàn)重定向過程中添加請(qǐng)求頭信息

    Java實(shí)現(xiàn)重定向過程中添加請(qǐng)求頭信息

    在Java中,我們經(jīng)常需要使用網(wǎng)絡(luò)請(qǐng)求來與服務(wù)器進(jìn)行通信,在進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),有時(shí)我們需要在重定向過程中添加請(qǐng)求頭信息,本文將介紹如何使用Java在重定向過程中添加請(qǐng)求頭,并提供相應(yīng)的代碼示例,
    2023-10-10
  • java 異常的實(shí)例詳解

    java 異常的實(shí)例詳解

    這篇文章主要介紹了java 異常的實(shí)例詳解的相關(guān)資料,希望通過本文大家能徹底掌握java異常的使用方法,需要的朋友可以參考下
    2017-09-09
  • Java截取字符串的幾種方法示例

    Java截取字符串的幾種方法示例

    眾所周知java提供了很多字符串截取的方式,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java截取字符串的幾種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • springboot2.3 整合mybatis-plus 高級(jí)功能及用法詳解

    springboot2.3 整合mybatis-plus 高級(jí)功能及用法詳解

    這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級(jí)功能,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java如何提供給第三方使用接口方法詳解

    Java如何提供給第三方使用接口方法詳解

    最近在做一個(gè)項(xiàng)目,因一些機(jī)制問題,需要我用java代碼調(diào)用第三方接口,下面這篇文章主要給大家介紹了關(guān)于Java如何提供給第三方使用接口方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 在Java中動(dòng)態(tài)執(zhí)行字符串代碼的方法小結(jié)

    在Java中動(dòng)態(tài)執(zhí)行字符串代碼的方法小結(jié)

    在Java編程中,靜態(tài)編譯的特性通常不允許我們直接執(zhí)行運(yùn)行時(shí)生成的代碼,然而,有時(shí)我們需要?jiǎng)討B(tài)地生成并執(zhí)行代碼片段,本文將詳細(xì)介紹如何在Java中運(yùn)行一段字符串代碼,并提供詳細(xì)的代碼案例和運(yùn)行結(jié)果,需要的朋友可以參考下
    2024-08-08
  • Java異常簡介和架構(gòu)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java異常簡介和架構(gòu)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要分享了Java異常簡介和架構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • springboot 如何配置多個(gè)jndi數(shù)據(jù)源

    springboot 如何配置多個(gè)jndi數(shù)據(jù)源

    這篇文章主要介紹了springboot 如何配置多個(gè)jndi數(shù)據(jù)源的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論

正安县| 南华县| 宁化县| 崇义县| 庆安县| 清丰县| 江安县| 梨树县| 清远市| 宜良县| 温宿县| 荥阳市| 四会市| 南涧| 烟台市| 珠海市| 北流市| 萨嘎县| 三穗县| 礼泉县| 南华县| 博罗县| 舒城县| 武强县| 吉木萨尔县| 通江县| 南乐县| 扬中市| 方城县| 垣曲县| 犍为县| 慈利县| 温州市| 牟定县| 罗源县| 思茅市| 洞头县| 祁连县| 修文县| 奉贤区| 道孚县|