Spring Data Jpa的四種查詢方式詳解
這篇文章主要介紹了Spring Data Jpa的四種查詢方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
一、調(diào)用接口的方式
1.基本介紹
通過調(diào)用接口里的方法查詢,需要我們自定義的接口繼承Spring Data Jpa規(guī)定的接口
public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>
使用這幾種方法的前提是你定義的實(shí)體類必須標(biāo)注上相應(yīng)的注解
@Entity //標(biāo)注這是一個(gè)實(shí)體類 @Table(name = "tbl_user") //建立實(shí)體類與表的映射關(guān)系 public class User { @Id //聲明此屬性為主鍵 @GeneratedValue(strategy = GenerationType.IDENTITY) //主鍵生成策略,自增 @Column(name = "user_id")//指定屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)表的列名 private Integer userId; @Column(name = "user_name") private String userName; @Column(name = "user_address") private String userAddress; @Column(name = "user_salary") private Double userSalary; //...getter setter toString方法 }
JpaRepository<T,ID>
第一個(gè)接口里面定義了一些簡(jiǎn)單的CRUD方法,泛型T是你定義的實(shí)體類的類型,泛型ID是你的實(shí)體類里主鍵的類型
JpaSpecificationExecutor
這個(gè)接口可以幫助我們完成一些復(fù)雜查詢,泛型T是你定義的實(shí)體類的類型
2.使用方法
只需要編寫一個(gè)自己的接口繼承上述兩個(gè)接口并填好泛型即可調(diào)用
//測(cè)試類,調(diào)用接口的findAll方法 @Test public void testFindAll(){ List<User> users = userDao.findAll(); for (User user : users) { System.out.println(user); } }
3.注意事項(xiàng)
JpaRepository接口里有findOne()和getOne()方法,從字面意思上來看,兩種方法都是查詢一個(gè),的確如此,但它們兩個(gè)本質(zhì)上卻有一定的差別
findOne()
底層調(diào)用了find()方法,當(dāng)我們調(diào)用這個(gè)方法的時(shí)候直接為我們查出結(jié)果
getOne()
底層調(diào)用了getReference()方法,是一種懶加載的模式,使用動(dòng)態(tài)代理的方式為我們創(chuàng)建一個(gè)動(dòng)態(tài)代理對(duì)象,當(dāng)我們調(diào)用查詢結(jié)果時(shí)才會(huì)發(fā)送sql語(yǔ)句,查詢出我們需要的結(jié)果
二、jpql查詢
1.基本介紹
jpql即 Jpa Query Language
jpql語(yǔ)法和sql其實(shí)大同小異,jpql是針對(duì)實(shí)體類進(jìn)行的操作,sql是直接對(duì)數(shù)據(jù)庫(kù)表的操作,所以jpql里只是將sql里數(shù)據(jù)庫(kù)表名、列名等信息替換為實(shí)體類屬性而已
例如
sql語(yǔ)句的查詢:select * from tbl_user where user_name = ?
jpql語(yǔ)句的查詢:from User where userName = ?
2.使用方法
自定義的方法,這里使用@Query注解,value是jpql語(yǔ)句,你可能注意到了,每個(gè)問號(hào)后面都帶了一個(gè)數(shù)字,這個(gè)數(shù)字其實(shí)就表示這個(gè)屬性對(duì)應(yīng)方法內(nèi)形參的位置,這樣我們就可以不按照屬性的順序進(jìn)行賦值了。
/** * 根據(jù)用戶id和name查詢 * @return 用戶對(duì)象 */ @Query(value = "from User where userId = ?2 and userName = ?1") User findUserByIdAndName(String name, int id);
測(cè)試代碼
@Test public void testJpql1(){ User user = userDao.findUserByIdAndName("張三", 1); System.out.println(user); }
3.注意事項(xiàng)
想要使用jpql的前提是你已經(jīng)使用注解配置好了實(shí)體類以及參數(shù)
注解的詳細(xì)信息如下:
/** * @Entity * 作用:指定當(dāng)前類是實(shí)體類。 * @Table * 作用:指定實(shí)體類和表之間的對(duì)應(yīng)關(guān)系。 * 屬性: * name:指定數(shù)據(jù)庫(kù)表的名稱 * @Id * 作用:指定當(dāng)前字段是主鍵。 * @GeneratedValue * 作用:指定主鍵的生成方式。。 * 屬性: * strategy :指定主鍵生成策略。 * GenerationType.IDENTITY:自增,底層數(shù)據(jù)庫(kù)必須支持自增(mysql) * GenerationType.SEQUENCE:序列,底層數(shù)據(jù)庫(kù)必須支持序列(oracle) * GenerationType.TABLE:jpa提供的一種策略,通過生成一張表的方式完成主鍵自增,這張表存儲(chǔ)了下一次添加的主鍵的值 * GenerationType.AUTO:由程序自動(dòng)選擇一種策略 * * @Column * 作用:指定實(shí)體類屬性和數(shù)據(jù)庫(kù)表之間的對(duì)應(yīng)關(guān)系 * 屬性: * name:指定數(shù)據(jù)庫(kù)表的列名稱。 * unique:是否唯一 * nullable:是否可以為空 * inserttable:是否可以插入 * updateable:是否可以更新 * columnDefinition: 定義建表時(shí)創(chuàng)建此列的DDL * secondaryTable: 從表名。如果此列不建在主表上(默認(rèn)建在主表),該屬性定義該列所在從表的名字搭建開發(fā)環(huán)境[重點(diǎn)] */
三、sql查詢
1.基本介紹
使用sql語(yǔ)句查詢
2.使用方法
自定義的方法,與jpql不同的是,這種方法需要加上nativeQuery=true來聲明這是一個(gè)本地查詢(sql查詢)
/** * 使用sql進(jìn)行條件查詢 */ @Query(value = "select * from tbl_user where user_name like ?",nativeQuery = true) List<User> sqlFindByName(String name);
測(cè)試方法
@Test public void testSql2(){ List<User> users = userDao.sqlFindByName("%張%"); for (User user : users) { System.out.println(user); } }
四、方法命名規(guī)則查詢
1.基本介紹
顧名思義,這種方法就是使用Spring Data JPA規(guī)定的方法名稱進(jìn)行查詢,這種方式不需要我們寫jpql或者sql,Spring Data JPA會(huì)解析方法名幫我們自動(dòng)創(chuàng)建查詢
2.使用方法
自定義方法
/** * 根據(jù)用戶名模糊查詢和id匹配查詢 * @param name * @param id * @return */ List<User> findUserByUserNameLikeAndUserId(String name, int id);
測(cè)試
@Test public void TestName1(){ List<User> users = userDao.findUserByUserNameLikeAndUserAddress("%張%", "北京"); for (User user : users) { System.out.println(user); } }
3.命名規(guī)則
按照Spring Data JPA 定義的規(guī)則,查詢方法以findBy開頭,刪除方法以deleteBy...... 涉及條件查詢時(shí),條件的屬性用條件關(guān)鍵字連接,要注意的是:條件屬性首字母需大寫??蚣茉谶M(jìn)行方法名解析時(shí),會(huì)先把方法名多余的前綴截取掉,然后對(duì)剩下部分進(jìn)行解析。
如果你使用的編譯器是idea,當(dāng)你編寫的時(shí)候idea也會(huì)給出提示。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)查詢的兩種方法
- spring data jpa使用詳解(推薦)
- Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)條件與范圍查詢實(shí)例代碼
- Spring Data JPA 實(shí)現(xiàn)多表關(guān)聯(lián)查詢的示例代碼
- Spring Data JPA 復(fù)雜/多條件組合分頁(yè)查詢
- Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁(yè))
- Spring Data JPA調(diào)用存儲(chǔ)過程實(shí)例代碼
- Spring Data JPA的作用和用法小結(jié)
相關(guān)文章
Java程序中實(shí)現(xiàn)調(diào)用Python腳本的方法詳解
這篇文章主要介紹了Java程序中實(shí)現(xiàn)調(diào)用Python腳本的方法,結(jié)合實(shí)例形式分析了eclipse環(huán)境中使用Java調(diào)用Python腳本的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-03-03Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Java中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式的相關(guān)算法原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03maven插件assembly使用及springboot啟動(dòng)腳本start.sh和停止腳本 stop.sh
這篇文章主要介紹了maven插件assembly使用及springboot啟動(dòng)腳本start.sh和停止腳本 stop.sh的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Spring中@Conditional注解的詳細(xì)講解及示例
這篇文章主要介紹了Spring中@Conditional注解的詳細(xì)講解及示例,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊(cè)bean,需要的朋友可以參考下2023-11-11java模板引擎Thymeleaf和前端vue的區(qū)別及說明
這篇文章主要介紹了java模板引擎Thymeleaf和前端vue的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Java 圖文并茂講解主方法中的String[] args參數(shù)作用
很多老鐵不清楚JAVA主方法中main()里面的的參數(shù)是什么意思,以及有什么作用,接下來給大家用最通俗易懂的話來講解,還不清楚的朋友來看看吧2022-04-04JAVA使用動(dòng)態(tài)代理對(duì)象進(jìn)行敏感字過濾代碼實(shí)例
這篇文章主要介紹了JAVA使用動(dòng)態(tài)代理對(duì)象進(jìn)行敏感字過濾代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09