中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringData?JPA的常用語法有哪些

發布時間:2022-06-09 09:16:37 來源:億速云 閱讀:168 作者:zzz 欄目:開發技術

今天小編給大家分享一下SpringData JPA的常用語法有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    前言

    SpringData JPA常用有兩種寫法,一個是用Jpa自帶方法進行CRUD,適合簡單查詢場景、例如查詢全部數據、根據某個字段查詢,根據某字段排序等等。另一種是使用注解方式,@Query@Modifying

    1.方法方式

    方法說明

    接口方法如下,方法作用見注釋:

    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);

    2.注解方式

    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的多表聯查的例子來說明復雜的查詢要怎么寫。下面是usertask表關聯查詢出任務名稱、任務ID、用戶名稱這些信息,并且根據task_nametask_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的常用語法有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    邳州市| 额尔古纳市| 灵寿县| 武胜县| 永德县| 庆安县| 沁源县| 开鲁县| 吉首市| 新平| 许昌县| 兴隆县| 诏安县| 鄯善县| 张家港市| 香格里拉县| 东台市| 马山县| 和平区| 杭锦旗| 汪清县| 丽水市| 洞头县| 上虞市| 保德县| 疏附县| 泾阳县| 来宾市| 平阳县| 泾源县| 东莞市| 泰州市| 麦盖提县| 名山县| 鞍山市| 荃湾区| 虞城县| 松江区| 辰溪县| 洛扎县| 海城市|