SpringData通過@Query註解支援JPA語句和原生SQL語句
在SpringData中們可是使用繼承介面直接按照規則寫方法名即可完成查詢的方法,不需要寫具體的實現,但是這樣寫又是不能滿足我們的需求,比如子查詢,SpringData中提供了@Query註解可以讓我們寫JPA的語句和原生的SQL語句,那接下來看看怎麼寫JPA的查詢語句和原生的SQL語句。
package com.springdata.study.repository; import java.util.List; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import org.springframework.data.repository.query.Param; import com.springdata.study.entitys.Person; //1.實際上Repository是一個口介面,沒有提供任何方法,是一個標記介面 //2.實現了Repository介面就會被spring IOC容器識別為Repository Bean // 會被納入IOC容器中 //3.Repository介面也可以同@RepositoryDefinition 註解代替,效果是一樣的 //4.介面中的泛型:第一個是那個實體類的Repository,第二個是實體類的主鍵的型別 //@RepositoryDefinition(domainClass=Person.class,idClass=Integer.class) /** * 在Repository介面中申明方法 1.申明方法需要符合一定的規範 2.查詢方法需要以 find | read | get開頭 3.涉及查詢條件時 * 需要用條件關鍵字連線 4.屬性首字母大寫 5.支援級聯屬性 * 6.AddressId若當前實體類中有屬性,則優先使用該屬性,若想要使用級聯屬性,需要用下劃線隔開Address_Id */ public interface PersonRepositoiry extends Repository<Person, Integer> { // select p from Person where p.name = ? Person getByName(String name); List<Person> findByNameStartingWithAndIdLessThan(String name, Integer id); // where name like %? and id < ? List<Person> findByNameEndingWithAndIdLessThan(String name, Integer id); // where email in ? age < ? List<Person> readByEmailInOrAgeLessThan(List<String> emails, int age); // 級聯屬性查詢 // where address.id > ? List<Person> findByAddress_IdGreaterThan(Integer is); // 可以使用@Query註解在其value屬性中寫JPA語句靈活查詢 @Query("SELECT p FROM Person p WHERE p.id = (SELECT max(p2.id) FROM Person p2)") Person getMaxIdPerson(); // 在@Query註解中使用佔位符 @Query(value = "SELECT p FROM Person p where p.name = ?1 and p.email = ?2") List<Person> queryAnnotationParam1(String name, String email); // 使用命名引數傳遞引數 @Query(value = "SELECT p FROM Person p where p.name = :name") List<Person> queryAnnotationParam2(@Param("name") String name); // SpringData可以在引數上新增% @Query("SELECT p FROM Person p WHERE p.name LIKE %?1%") List<Person> queryAnnotationLikeParam(String name); // SpringData可以在引數上新增% @Query("SELECT p FROM Person p WHERE p.name LIKE %:name%") List<Person> queryAnnotationLikeParam2(@Param("name")String name); //在@Query註解中新增nativeQuery=true屬性可以使用原生的SQL查詢 @Query(value="SELECT count(*) FROM jpa_person", nativeQuery=true) long getTotalRow(); }
下面是這個類的測試類
package com.springdata.study.test;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import javax.sql.DataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.springdata.study.entitys.Person;
import com.springdata.study.repository.PersonRepositoiry;
import com.springdata.study.service.PersonService;
public class DataSourceTest {
private ApplicationContext applicationContext;
private PersonService personService;
private PersonRepositoiry personRepositoiry;
{
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
personRepositoiry = applicationContext.getBean(PersonRepositoiry.class);
personService = applicationContext.getBean(PersonService.class);
}
@SuppressWarnings("resource")
@Test
public void testDataSource() throws SQLException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource = applicationContext.getBean(DataSource.class);
System.out.println(dataSource.getConnection());
}
@Test
public void testSpringdata() {
Object person = personService.getPerson("LQF");
System.out.println(person);
}
@Test
public void testFindByNameStartingWithAndIdLessThan() {
List<Person> persons = personRepositoiry.findByNameStartingWithAndIdLessThan("g", 6);
persons = personRepositoiry.findByNameEndingWithAndIdLessThan("g", 6);
System.out.println(persons);
}
@Test
public void testReadByEmailInOrAgeLessThan() {
List<Person> persons = personRepositoiry.readByEmailInOrAgeLessThan(Arrays.asList(" [email protected]"), 25);
System.out.println(persons);
}
@Test
public void testFindByAddressIdGreaterThan() {
personRepositoiry.findByAddress_IdGreaterThan(1);
}
@Test
public void testGetMaxIdPerson() {
Person person = personRepositoiry.getMaxIdPerson();
System.out.println(person);
}
@Test
public void testQueryAnnotationParam() {
List<Person> persons = personRepositoiry.queryAnnotationParam1("liqingfeng", " [email protected]");
System.out.println(persons);
}
@Test
public void testQueryAnnotationParam2() {
List<Person> persons = personRepositoiry.queryAnnotationParam2("lqf");
System.out.println(persons);
}
@Test
public void testQueryAnnotationLikeParam() {
List<Person> persons = personRepositoiry.queryAnnotationLikeParam2("li");
System.out.println(persons);
}
@Test
public void testGetTotalRow() {
long count = personRepositoiry.getTotalRow();
System.out.println(count);
}
}
相關推薦
SpringData通過@Query註解支援JPA語句和原生SQL語句
在SpringData中們可是使用繼承介面直接按照規則寫方法名即可完成查詢的方法,不需要寫具體的實現,但是這樣寫又是不能滿足我們的需求,比如子查詢,SpringData中提供了@Query註解可以讓我們寫JPA的語句和原生的SQL語句,那接下來看看怎麼寫JPA的查詢語句和原生
mongoTemplate通過Query條件指定查詢條件和返回欄位
一.簡介 Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate對MongoDB的CRUD的操作,上一篇我們介紹了對MongoDB的新增和刪除, 今天
註解支援定時任務和非同步處理
Spring支援使用註解開啟定時任務和非同步方法執行 為了支援@Scheduled 和 @Async 註解,需要在你的@Configuration類上加 @EnableScheduling 和@EnableAsync 註解 @EnableScheduling @Ena
Python 的條件語句和循環語句
while語句 lock 分支 程序 使用 多條 if 語句 cas if...else 一、順序結構 順序結構是最簡單的一種程序結構,程序按照語句的書寫次序自上而下順序執行。 二、分支控制語句 Python條件語句是通過一條或多條語句的執行結果(True或者False)來
delphi異常捕獲try except語句 和 try finally語句用法
perror 方式 檢測 變量 debug 創建用戶 進行 範圍 需要 原文地址:delphi try except語句 和 try finally語句用法以及區別 一直寫程序都沒管他們,也盡量很少用,今天終於想把他給弄個明白,在網上找來,記下!主要是前面小部分,後
第四天:python判斷語句和循環語句
python一、判斷語句<1>開發中的判斷場景密碼判斷重要日期判斷 if 今天是周六或者周日: 約妹子 if 今天是情人節: 買玫瑰 if 今天發工資: 先還信用卡的錢 if 有剩余:
C#語言中常用的判斷語句和循環語句
只讀 代碼示例 賦值 循環 數字 其他 do while 表達 集合 C#語言中,我們常用的判斷語句和循環語句都有哪些呢? 1、if判斷 代碼格式:if(條件1){ 代碼1 }else if(條件2){ 代碼2
Shell腳本之for、while循環語句和case分支語句
for語句 while語句 case語句 shell 楊書凡 shell作為一種腳本編程語言,同樣包含循環、分支等其他程序控制結構,從而輕松完成更加復雜、強大的功能使用for循環語句 在工作中,經常遇到某項任務需要多次執行,而每次執行僅僅是處理對象不一樣,其他命令都相同。使用
MySQL-5.6.34通過show global status like 來查看sql語句的執行情
cal erro optimize col resign relay trigge log sql語句 需求 老大:zain啊,咱們的數據庫今天有多少查詢語句啊?我 :額,稍等,我看看啊; 心想,{尼瑪,我怎麽知道有多少select語句啊} 那麽問題來了,
<Ajax> 二. PHP選擇語句和循環語句
gpo while ... bsp bre pos 星期六 color ajax <?php echo ‘<br> --------- 選擇語句 ------- <br>‘; // 選擇語句 $day = ‘星期日‘; switch ($da
C++程序設計基礎(3)條件語句和循環語句
程序員面試 true 短信 har 單引號 turn table tchar strong 註:讀《程序員面試筆記》筆記總結 1.知識點 1.1條件語句 (1)if……;(2)if……else……;(3)if……else if……;(4)switch(){case ():b
判斷語句和循環語句
cto 51cto water ESS fff sha shadow ces 語句 判斷語句和循環語句
shell腳本判斷語句和循環語句
一次循環 操作 inf 分享圖片 學習 兩層 read 一次 down if判斷語句 exit跳出判讀語句 不加exit的結果 read -n(不換行) 判斷是否輸入的是數字 read age[[ $age =~ ^[
if語句,if...else if語句和switch...case語句的區別和分析
當我們有一個判斷條件的時候,顯然用if語句比較方便有效。但當判斷條件很多的時候,我們可以使用if語句或者if....eles 語句和switch case 語句。 if...else if語句和多個if語句的區別還是很大的,if...else if在任何一個環節滿足條件的時候就將會終
mongodb查詢語句,對應成sql語句,方便熟悉和使用
鍾偉海 [email protected] 2018-09 上面是mongodb查詢語句,下面是sql語句。對照著用,挺方便。 1:mongodb 中查詢最大值 db.getCollection('users ').find({}).sort({"
while語句和do...while語句
語法: while(布林表示式){ 迴圈體; } 先判斷表示式,直到表示式不成立時結束迴圈體; do{ 迴圈體 }while(布林表示式); 先執行迴圈體,在判斷表示式,直到表示式不成立時,結束迴圈體; package demo; publ
javascript語句——條件語句、迴圈語句和跳轉語句
前面的話 預設情況下,javascript直譯器依照語句的編寫順序依次執行。而javascript中的很多語句可以改變語句的預設執行順序。本文介紹可以改變語句預設執行順序的條件語句、迴圈語句和跳轉語句 條件語句 指令碼的威力體現在它們可以根據人們給出的各種條件做出決策,javascript使
Informix資料表結構分析資料整理之欄位型別說明和查詢SQL語句
查詢所有Informix資料表字段型別SQL語句: select a.tabname,b.colname,b.coltype,case b.coltype when '0' then 'CHAR' when '1' then 'SMALLINT' when '2' the
FPGA第八篇:運算子、賦值語句和結構說明語句
第四章——《運算子、賦值語句和結構說明語句》 一、概念 1、邏輯運算子(&&、||、!) 2、關係運算符(<、<=、>、>=) 3、等式運算子(==、!=、===、!==) 4、移位運算子(>>、<<) 注
經典MySQL語句大全和常用SQL語句命令的作用。
轉自網路: 經典MSSQL語句大全和常用SQL語句命令的作用 下列語句部分是Mssql語句,不可以在access中使用。 SQL分類: DDL型別包括資料庫、表的建立,修改,刪除,宣告—資料定義語言(CREATE,ALTER,DROP,DECLARE) DML型別包括資料