1. 程式人生 > >SpringData通過@Query註解支援JPA語句和原生SQL語句

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型別包括資料