<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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
倒序。
共有幾點需要注意:
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);
以上列舉了兩種JPA的crud方式,jpa方法與註解方式,平時寫程式碼時更傾向於使用註解方式去寫原生sql來實現業務。對於簡單查詢可以用JpaRepository
裡面這些方法就夠用了,對於更復雜的場景推薦使用@Query
寫sql的方式來實現。
jpa方法可以遮蔽底層的sql,如果有不同資料庫實現的服務,用jpa方法可以免於修改sql。但是jpa方法對於分組查詢、limit支援、多條件、多表聯查這些不太友好。
到此這篇關於SpringData JPA常用語法的文章就介紹到這了,更多相關SpringData JPA常用語法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45