日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Data JPA使用JPQL與原生SQL進(jìn)行查詢的操作

瀏覽:112日期:2023-07-10 14:43:47
1、使用JPQL語句進(jìn)行查詢

JPQL語言(Java Persistence Query Language)是一種和SQL非常類似的中間性和對象化查詢語言,它最終會被編譯成針對不同底層數(shù)據(jù)庫的SQL語言,從而屏蔽不同數(shù)據(jù)庫的差異。

JPQL語言通過Query接口封裝執(zhí)行,Query 接口封裝了執(zhí)行數(shù)據(jù)庫查詢的相關(guān)方法。調(diào)用 EntityManager 的 Query、NamedQuery 及 NativeQuery 方法可以獲得查詢對象,進(jìn)而可調(diào)用Query接口的相關(guān)方法來執(zhí)行查詢操作。

JPQL是面向?qū)ο筮M(jìn)行查詢的語言,可以通過自定義的JPQL完成UPDATE和DELETE操作。JPQL不支持使用INSERT。對于UPDATE或DELETE操作,必須使用注解 @Modifying 進(jìn)行修飾。

【示例】使用JPQL語言進(jìn)行查詢

package com.pjb.jpauserdemo.dao; import com.pjb.jpauserdemo.entity.UserInfo;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Modifying;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param;import org.springframework.stereotype.Repository;import java.util.List; /** * 用戶信息數(shù)據(jù)庫訪問接口 * 使用JPQL語言 * @author pan_junbiao **/@Repositorypublic interface UserJpqlDao extends JpaRepository<UserInfo,Integer>{ /** * 根據(jù)用戶姓名,查詢用戶信息 */ @Query('SELECT u FROM UserInfo u WHERE u.userName = ?1') public UserInfo getUserInfoByName(String name); /** * 根據(jù)用戶姓名,模糊查詢用戶列表 */ @Query('SELECT u FROM UserInfo u WHERE u.userName like %:name%') public List<UserInfo> getUserListByName(String name); /** * 修改用戶姓名 */ @Modifying @Query('UPDATE UserInfo u SET u.userName = :name WHERE u.userId = :id') public int updateUserName(@Param('id')int userId, @Param('name')String userName);}2、使用原生SQL語句進(jìn)行查詢

在使用原生SQL查詢時,也使用@Query注解。此時,nativeQuery參數(shù)需要設(shè)置為true。

【示例】使用原生SQL語句進(jìn)行查詢

package com.pjb.jpauserdemo.dao;import com.pjb.jpauserdemo.entity.UserInfo;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Modifying;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param;import org.springframework.stereotype.Repository;import org.springframework.transaction.annotation.Transactional;import java.util.List; /** * 用戶信息數(shù)據(jù)庫訪問接口測試類 * 使用原生SQL語言 * @author pan_junbiao **/@Repositorypublic interface UserSqlDao extends JpaRepository<UserInfo,Integer>{ /** * 根據(jù)用戶ID,獲取用戶信息 */ @Query(value = 'SELECT * FROM tb_user WHERE user_id = :id',nativeQuery = true) public UserInfo getUserById(@Param('id')int userId); /** * 根據(jù)用戶姓名,模糊查詢用戶列表 */ @Query(value = 'SELECT * FROM tb_user WHERE user_name LIKE %:userName%',nativeQuery = true) public List<UserInfo> getUserListByName(@Param('userName')String userName); /** * 修改用戶姓名 */ @Modifying @Query(value = 'UPDATE tb_user SET user_name = :name WHERE user_id = :id',nativeQuery = true) public int updateUserName(@Param('id')int userId, @Param('name')String userName);}

可以看到,@Query與@Modifying這兩個注解一起聲明,可以定義個性化更新操作。

Spring data jpa@query使用原生SQl,需要注意的坑

根據(jù)代碼來解說:

@Query(value = 'select bill.id_ as id, bill.created_date as date, bill.no, lawyer_case .case_no as caseNo, ' + 'lawyer_case .case_name as caseName, customer.no as customerNo, customer.cn_name as customerName, ' + 'bill.total_expense_after_tax, bill.collected_money, bill.book_ticket_amount, bill.version ' + 'e1.name as creator, bill.status' + 'from bill ' + 'left join lawyer_case on lawyer_case .case_no=bill.case_no ' + 'left join customer on customer.no=bill.customer_no ' + 'left join employee e1 on e1.id_=bill.creator ' + 'where IF (?1!=’’, customer_no=?1, 1=1) ' + 'and IF (?2!=’’, case_no=?2, 1=1) ' + 'and IF (?3!=’’, status=?3, 1=1) ' + 'and IF (?4!=’’, creator’%’,?4,’%’)), 1=1) ' + 'and create_by=?5 ' + 'ORDER BY ?#{#pageable} ', countQuery = 'select count(*) ' + 'from bill ' + 'left join lawyer_case on lawyer_case .case_no=bill.case_no ' + 'left join customer on customer.no=bill.customer_no ' + 'left join employee e1 on e1.id_=bill.creator ' + 'where IF (?1!=’’, customer_no=?1, 1=1) ' + 'and IF (?2!=’’, case_no=?2, 1=1) ' + 'and IF (?3!=’’, status=?3, 1=1) ' + 'and IF (?4!=’’, creator’%’,?4,’%’)), 1=1) ' + 'and create_by=?5 '+ 'ORDER BY ?#{#pageable} ', nativeQuery = true) Page<Object[]> findAllBill(String customerNo, String caseNo, Integer status, String creator, String createBy, Pageable pageable);需要注意的方法有以下幾點(diǎn):

1、From 不支持重命名.

2、返回的是一個page<Object[]>,數(shù)組中只保存了數(shù)據(jù),沒有對應(yīng)的key,只能根據(jù)返回數(shù)據(jù)的順序,依次注入到DTO中。

3、對于使用分頁,需要:“ORDER BY ?#{#pageable}”,可以直接傳入一個pageable對象,會自動解析。

4、注意格式問題,很多時候就是換行的時候,沒有空格。

5、仔細(xì)對應(yīng)數(shù)據(jù)庫中表字段,很多時候報某個字段找不到,就是因?yàn)樽侄蚊麑戝e,和數(shù)據(jù)庫中對應(yīng)不上。

6、這是解決使用微服務(wù),大量的數(shù)據(jù)都需要遠(yuǎn)程調(diào)用,會降低程序的性能。

7、使用Pageabel作為參數(shù)的時候,去進(jìn)行分頁。剛開始的時候,覺得還是一個可行的辦法,但是得注意的時候,當(dāng)需要排序的時候,是無法加入sort字段的。 會一直報錯left*。

8、針對7的解決方案,把原生SQL的數(shù)據(jù)查詢和countQuery分成兩個查詢方法。得到count,然后進(jìn)行判斷,若是等于0,則直接返回空集合;反之,則取獲取數(shù)據(jù)。 需要自己進(jìn)行分頁計算,傳入正確的pageNumber和pageSize。 大部分系統(tǒng)都是按照修改時間進(jìn)行降序排序。 所以,order by可以寫死。然后pageNumber和pageSize動態(tài)傳入。 pageNumber的算法= (pageNumber - 1) * pageSize, 前提是PageNumber是從1開始,若0,則pageNumber=pageNumber * PageSize; 這樣就可以保證數(shù)據(jù)的正確。

/*** pageInfos: 轉(zhuǎn)換之后的數(shù)據(jù)。* pageable:傳入的pageable.* totalPage: 第一條SQL算好的返回值。* 這樣就可以統(tǒng)一的返回各種pageDTO。*/private Page<T> convertForPage(List<T> pageInfos, Pageable pageable, Integer totalPage) {return new PageImpl<>(pageInfos, pageable, totalPage); }

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久久网站| 久久国产电影| 天堂中文av在线资源库| 国产精品99一区二区三区| 色一区二区三区四区| 国产亚洲一区二区手机在线观看 | 高清av一区| 香蕉成人av| 亚洲免费播放| 石原莉奈在线亚洲二区| 日韩在线成人| 欧美极品中文字幕| 日韩电影免费网址| 欧美日韩国产一区二区三区不卡| 亚洲一区日本| 国产欧美日韩一区二区三区四区| 国产精品色在线网站| 久久香蕉精品香蕉| 99久久夜色精品国产亚洲狼| 亚洲男女自偷自拍| 欧美另类中文字幕| 老司机免费视频一区二区| 最新中文字幕在线播放 | 欧美99久久| 亚洲视频二区| 麻豆91精品91久久久的内涵| 日韩一区电影| 日韩一区欧美二区| 日本久久一区| 成人午夜毛片| 手机精品视频在线观看| 国产精品igao视频网网址不卡日韩 | 国产欧美日韩一区二区三区在线| 欧美国产免费| 久久久久国产精品一区二区| 视频一区中文字幕| 久久激五月天综合精品| 黑森林国产精品av| 免费久久99精品国产| 免费一区二区三区在线视频| 激情综合网址| 日韩综合小视频| 国产成人精选| 视频一区二区三区在线| 日韩成人精品一区二区| 一级欧美视频| 中文字幕在线高清| 日韩极品在线观看| 久久精品免费一区二区三区 | 亚洲精品无吗| 日韩伦理在线一区| 日韩精品第二页| 久久精品国产成人一区二区三区| 不卡在线一区| 免费日韩一区二区三区| 亚洲欧美日本国产专区一区| 精品深夜福利视频| 男女男精品网站| 色天使综合视频| 97成人在线| 婷婷亚洲五月| 精品国产亚洲一区二区三区在线 | 五月天久久久| 精品视频久久| 久久久影院免费| 国产精品多人| 亚洲人亚洲人色久| 日韩久久一区二区三区| 国产精品久av福利在线观看| 综合视频一区| 91久久久久| 超碰99在线| 国产欧美日韩一区二区三区四区| 香蕉精品999视频一区二区| 国产日韩电影| 国产一精品一av一免费爽爽| 久久国产精品久久w女人spa| 999国产精品视频| 精品久久97| 欧美精品99| 青青伊人久久| 日本成人在线视频网站| 一二三区精品| 久久最新视频| 亚洲欧美日韩视频二区| 久久九九精品| 麻豆理论在线观看| 精品国产精品国产偷麻豆| 97成人在线| 国产色99精品9i| 日韩和欧美的一区| 免费在线看一区| 亚洲综合另类| 日韩制服丝袜av| 日韩中文字幕亚洲一区二区va在线| 狠狠色综合网| 亚洲一区日本| 一区二区国产在线| 婷婷亚洲成人| 久久精品 人人爱| 国产精品www994| 国内精品麻豆美女在线播放视频| 免费在线亚洲| 国产精品99一区二区三区| 日韩精品诱惑一区?区三区| 成人国产综合| 日韩啪啪电影网| 精品在线91| 三级在线观看一区二区 | 国产传媒在线观看| 激情国产在线| 日韩一区三区| 午夜精品一区二区三区国产| 亚洲免费播放| 日韩美女国产精品| 欧美aaaaaa午夜精品| 国产在线视频欧美一区| 久久婷婷久久| 欧美日韩精品在线一区| 欧美日韩国产高清| 在线精品观看| 国产九九精品| 成人久久久久| 久热re这里精品视频在线6| 欧美亚洲tv| 国产精品蜜芽在线观看| 99pao成人国产永久免费视频 | 91精品蜜臀一区二区三区在线| 欧美亚洲激情| 在线一区二区三区视频| 日本一区中文字幕| 国产精品主播| 日韩免费小视频| 亚洲永久字幕| 国产精品视频3p| 99热精品久久| 日本国产亚洲| 激情视频网站在线播放色| 亚洲激情黄色| 国产精品www.| 欧美日韩国产高清电影| 青青草精品视频| 色偷偷色偷偷色偷偷在线视频| 欧美日韩精品在线一区| 免费在线看一区| 日产欧产美韩系列久久99| 久久精品色播| 久久av一区二区三区| 国产探花一区在线观看| 亚洲一级网站| 91午夜精品| 婷婷成人综合| 国产欧美一级| 91久久国产| 国产精品sm| 九一成人免费视频| 国产欧美日韩一区二区三区四区| 精品捆绑调教一区二区三区| 亚洲日本欧美| 国产 日韩 欧美一区| 亚洲欧美日韩国产一区二区| 国产精品99精品一区二区三区∴ | 神马午夜在线视频| 中文字幕av一区二区三区人| 狠狠躁少妇一区二区三区| 日韩一区二区三区四区五区| 日本精品不卡| 国产精品4hu.www| 久久福利毛片| 中文字幕在线视频网站| 日韩二区三区在线观看| 欧美日韩一二| 国产精品网址| 免费欧美在线视频| 国内亚洲精品| 精品一区二区三区亚洲| 亚洲精品一二三**| 激情久久久久久久| 成人欧美一区二区三区的电影| 欧美日韩伊人| 免费成人性网站| 黑丝一区二区| 亚洲精品国产嫩草在线观看| 蜜桃久久久久| 日韩欧美中文字幕一区二区三区| 91精品一区二区三区综合| 国产成人精选| 伊人成人在线视频| 日韩精品免费一区二区三区| 久久只有精品| 国产欧美综合一区二区三区| 香蕉久久夜色精品国产| 蜜桃tv一区二区三区| 日韩免费av| 久久久久久自在自线| 国产精品免费精品自在线观看| 日韩精品一区二区三区中文在线 | 亚洲一区二区成人| 欧美91视频| 亚洲午夜av|