Spring Data Jpa的四種查詢方式詳解
這篇文章主要介紹了Spring Data Jpa的四種查詢方式詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
一、調用接口的方式
1.基本介紹
通過調用接口里的方法查詢,需要我們自定義的接口繼承Spring Data Jpa規(guī)定的接口
public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>
使用這幾種方法的前提是你定義的實體類必須標注上相應的注解
@Entity //標注這是一個實體類
@Table(name = "tbl_user") //建立實體類與表的映射關系
public class User {
@Id //聲明此屬性為主鍵
@GeneratedValue(strategy = GenerationType.IDENTITY) //主鍵生成策略,自增
@Column(name = "user_id")//指定屬性對應數(shù)據庫表的列名
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>
第一個接口里面定義了一些簡單的CRUD方法,泛型T是你定義的實體類的類型,泛型ID是你的實體類里主鍵的類型

JpaSpecificationExecutor
這個接口可以幫助我們完成一些復雜查詢,泛型T是你定義的實體類的類型

2.使用方法
只需要編寫一個自己的接口繼承上述兩個接口并填好泛型即可調用
//測試類,調用接口的findAll方法
@Test
public void testFindAll(){
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
3.注意事項
JpaRepository接口里有findOne()和getOne()方法,從字面意思上來看,兩種方法都是查詢一個,的確如此,但它們兩個本質上卻有一定的差別
findOne()
底層調用了find()方法,當我們調用這個方法的時候直接為我們查出結果
getOne()
底層調用了getReference()方法,是一種懶加載的模式,使用動態(tài)代理的方式為我們創(chuàng)建一個動態(tài)代理對象,當我們調用查詢結果時才會發(fā)送sql語句,查詢出我們需要的結果
二、jpql查詢
1.基本介紹
jpql即 Jpa Query Language
jpql語法和sql其實大同小異,jpql是針對實體類進行的操作,sql是直接對數(shù)據庫表的操作,所以jpql里只是將sql里數(shù)據庫表名、列名等信息替換為實體類屬性而已
例如
sql語句的查詢:select * from tbl_user where user_name = ?
jpql語句的查詢:from User where userName = ?
2.使用方法
自定義的方法,這里使用@Query注解,value是jpql語句,你可能注意到了,每個問號后面都帶了一個數(shù)字,這個數(shù)字其實就表示這個屬性對應方法內形參的位置,這樣我們就可以不按照屬性的順序進行賦值了。
/** * 根據用戶id和name查詢 * @return 用戶對象 */ @Query(value = "from User where userId = ?2 and userName = ?1") User findUserByIdAndName(String name, int id);
測試代碼
@Test
public void testJpql1(){
User user = userDao.findUserByIdAndName("張三", 1);
System.out.println(user);
}
3.注意事項
想要使用jpql的前提是你已經使用注解配置好了實體類以及參數(shù)

注解的詳細信息如下:
/** * @Entity * 作用:指定當前類是實體類。 * @Table * 作用:指定實體類和表之間的對應關系。 * 屬性: * name:指定數(shù)據庫表的名稱 * @Id * 作用:指定當前字段是主鍵。 * @GeneratedValue * 作用:指定主鍵的生成方式。。 * 屬性: * strategy :指定主鍵生成策略。 * GenerationType.IDENTITY:自增,底層數(shù)據庫必須支持自增(mysql) * GenerationType.SEQUENCE:序列,底層數(shù)據庫必須支持序列(oracle) * GenerationType.TABLE:jpa提供的一種策略,通過生成一張表的方式完成主鍵自增,這張表存儲了下一次添加的主鍵的值 * GenerationType.AUTO:由程序自動選擇一種策略 * * @Column * 作用:指定實體類屬性和數(shù)據庫表之間的對應關系 * 屬性: * name:指定數(shù)據庫表的列名稱。 * unique:是否唯一 * nullable:是否可以為空 * inserttable:是否可以插入 * updateable:是否可以更新 * columnDefinition: 定義建表時創(chuàng)建此列的DDL * secondaryTable: 從表名。如果此列不建在主表上(默認建在主表),該屬性定義該列所在從表的名字搭建開發(fā)環(huán)境[重點] */
三、sql查詢
1.基本介紹
使用sql語句查詢
2.使用方法
自定義的方法,與jpql不同的是,這種方法需要加上nativeQuery=true來聲明這是一個本地查詢(sql查詢)
/** * 使用sql進行條件查詢 */ @Query(value = "select * from tbl_user where user_name like ?",nativeQuery = true) List<User> sqlFindByName(String name);
測試方法
@Test
public void testSql2(){
List<User> users = userDao.sqlFindByName("%張%");
for (User user : users) {
System.out.println(user);
}
}
四、方法命名規(guī)則查詢
1.基本介紹
顧名思義,這種方法就是使用Spring Data JPA規(guī)定的方法名稱進行查詢,這種方式不需要我們寫jpql或者sql,Spring Data JPA會解析方法名幫我們自動創(chuàng)建查詢
2.使用方法
自定義方法
/** * 根據用戶名模糊查詢和id匹配查詢 * @param name * @param id * @return */ List<User> findUserByUserNameLikeAndUserId(String name, int id);
測試
@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...... 涉及條件查詢時,條件的屬性用條件關鍵字連接,要注意的是:條件屬性首字母需大寫??蚣茉谶M行方法名解析時,會先把方法名多余的前綴截取掉,然后對剩下部分進行解析。
如果你使用的編譯器是idea,當你編寫的時候idea也會給出提示。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java編程小實例—數(shù)字時鐘的實現(xiàn)代碼示例
正所謂拳不離手曲不離口,java學習的過程中,練習還是要多一點比較好。接下來分享給大家一個Java編程的小實例,供朋友們參考。2017-10-10
基于Java實現(xiàn)ssh命令登錄主機執(zhí)行shell命令過程解析
這篇文章主要介紹了基于Java實現(xiàn)ssh命令登錄主機執(zhí)行shell命令過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12
java WebSocket的實現(xiàn)以及Spring WebSocket示例代碼
本篇文章主要介紹了java WebSocket的實現(xiàn)以及Spring WebSocket,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01
Java 深入淺出分析Synchronized原理與Callable接口
Synchronized關鍵字解決的是多個線程之間訪問資源的同步性,synchronized關鍵字可以保證被它修飾的方法或者代碼塊在任意時刻只能有一個線程執(zhí)行,Runnable是執(zhí)行工作的獨立任務,但是不返回任何值。如果我們希望任務完成之后有返回值,可以實現(xiàn)Callable接口2022-03-03
Java調用ChatGPT(基于SpringBoot和Vue)實現(xiàn)可連續(xù)對話和流式輸出的ChatGPT API
這篇文章主要介紹了Java調用ChatGPT(基于SpringBoot和Vue),實現(xiàn)可連續(xù)對話和流式輸出的ChatGPT API(可自定義實現(xiàn)AI助手),文中代碼示例介紹的非常詳細,感興趣的朋友可以參考下2023-04-04

