2019-10-24Spring Data Jpa @Query查詢

package cn.itcast.dao;

import cn.itcast.entity.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/*
* 符合SpringDataJpa的dao層接口規(guī)范
* JpaRepository<操作的實體類泛型,實體類中主鍵屬性的類型>
*       *封裝了基本增刪改查操作
* JpaSpecificationExecutor<操作的實體類類型>
*       *封裝了復(fù)雜查詢(分頁)
* */

public interface CustomerDao extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {
/*
* 案例复凳,根據(jù)客戶名稱查詢客戶
*        使用jpql的形式查詢
* jpql:from Customer where custName=?
* 配置jpql語句口柳,使用@Query注解
* */
    @Query(value="from Customer where custName=?")
    public Customer findJpql(String custName);

    /*
    * 案例功氨,根據(jù)客戶名稱和客戶id查詢用戶
    *       jpql:from Customer where custName=镜会? and custId=炫刷?
    *  對于多個占位符參數(shù)
    *       賦值的時候毕荐,默認(rèn)情況下翘地,占位符的位置需要和方法參數(shù)中的位置保持一致
    *可以指定占位符參數(shù)的位置
    *       添祸?索引的方式滚粟,指定此占位的取值來源
    *
    * */
    @Query(value = "from Customer where custName=?1 and custId=?2")
    public Customer findCustNameAndId(String name,Long id);
    /*
    * 使用jpql完成更新操作
    *      案例: 根據(jù)id更新,客戶的名稱
    *           更新7號客戶的名稱膝捞,將名稱改為“很nb”
    * sql: update cst_customer set cust_name=? where cust_id=?
    * jpql: update Customer set custName=? where custId=?
    *
    * @Query:代表進(jìn)行查詢
    *       *聲明此方法是用來更新操作
    * @Modifying
    *   *當(dāng)前執(zhí)行的是一個更新的操作
    * */
    @Query(value = "update Customer set custName=?2 where custId=?1")
    @Modifying
    public void updateCustName(long custId,String custName);


    /**
     *使用sql的形式查詢
     *      查詢?nèi)坑脩?     *      sql : select * from cst_customer
     *  @Query:配置sql查詢
     *      value:sql語句
     *      nativeQuery:查詢方式
     *         true:sql查詢
     *         false:jpql查詢
     */
//    @Query(value = "select * from cst_customer",nativeQuery = true)
    @Query(value = "select * from cst_customer where cust_name like ?1",nativeQuery = true)
    public List<Object[]>findSql(String name);
    /**
     * 方法名的約定
     *      findBy:查詢
     *          對象中的屬性名(首字母大寫):查詢的條件
     *          CustName
     *          *默認(rèn)情況  使用  等于的方式查詢
     *                  特殊的查詢方式
     * findByCustName -- 根據(jù)客戶名稱查詢
     * 在springdataJpa的運行階段
     *      會根據(jù)方法名稱進(jìn)行解析  findBy  from xxx(實體類)
     *                          屬性名     where custName=
     *
     *      1.findBy+屬性名稱(根據(jù)屬性名稱進(jìn)行完成匹配的查詢=)
     *      2.findBy+屬性名稱+查詢方式(like|isnull)
     *          findByCustNameLike
     *      3.多條件查詢
     *          findBy+屬性名+“查詢方式”+'多條件的連接符(and|or)'+屬性名+“查詢方式”
     */
    public  Customer findByCustName(String custName);

    public List<Customer> findByCustNameLike(String custName);
    //使用客戶名稱模糊匹配和客戶所屬行業(yè)精準(zhǔn)匹配的查詢
    public  Customer findByCustNameLikeAndCustIndustry(String name,String custIndustry);
}

package cn.itcast.test;

import cn.itcast.dao.CustomerDao;
import cn.itcast.entity.Customer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)//聲明spring提供的單元測試環(huán)境
@ContextConfiguration(locations = "classpath:applicationContext.xml")//指定spring容器的配置信息
public class JpqlTest {
@Autowired
    private CustomerDao customerDao;

@Test
    public void testFindJPQL(){
    Customer jpql = customerDao.findJpql("肇事");
    System.out.println("輸出的是:"+jpql);
}

@Test
    public void testFindCustNameAndId(){
    Customer customer = customerDao.findCustNameAndId("SS1111", 2l);
    System.out.println(customer);
    }
    /*
    * 測試jpql的更新操作
    *   *springDataJpa中使用jpql完成坦刀,更新/刪除操作
    *       *需要手動添加事務(wù)支持
    *       *默認(rèn)會執(zhí)行結(jié)束之后,回滾事務(wù)
    * */
    @Test
    @Transactional//添加事務(wù)的支持
    @Rollback(value = false)//設(shè)置自動回滾    false|true
    public void testUpdateCustomer(){
    customerDao.updateCustName(7l,"很nb");
    }
    @Test
    public void testFindSql(){
        List<Object[]> sql = customerDao.findSql("%東%");
        for (Object[] objects:sql){
            System.out.println(Arrays.toString(objects));
        }
    }
    /**
     * 測試方法命名規(guī)則的查詢
     */

    @Test
    public void testName(){
        Customer customer = customerDao.findByCustName("劉強東");
        System.out.println(customer);
    }

    @Test
    public void testFindByNameLike(){
        List<Customer> list = customerDao.findByCustNameLike("%強%");
        for (Customer customer : list){
            System.out.println(customer);
        }
    }
    @Test
    public void testFindByCustNameLikeAndCustIndustry(){
        Customer customer1 = customerDao.findByCustNameLikeAndCustIndustry("%強%", "教育");
        System.out.println(customer1);
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔬咬,一起剝皮案震驚了整個濱河市鲤遥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌林艘,老刑警劉巖盖奈,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狐援,居然都是意外死亡钢坦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門啥酱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爹凹,“玉大人,你說我怎么就攤上這事镶殷『探矗” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颤陶。 經(jīng)常有香客問我颗管,道長,這世上最難降的妖魔是什么滓走? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任垦江,我火速辦了婚禮,結(jié)果婚禮上搅方,老公的妹妹穿的比我還像新娘比吭。我一直安慰自己,他們只是感情好腰懂,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布梗逮。 她就那樣靜靜地躺著,像睡著了一般绣溜。 火紅的嫁衣襯著肌膚如雪慷彤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天怖喻,我揣著相機與錄音底哗,去河邊找鬼。 笑死锚沸,一個胖子當(dāng)著我的面吹牛跋选,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哗蜈,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼前标,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了距潘?” 一聲冷哼從身側(cè)響起炼列,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎音比,沒想到半個月后俭尖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡洞翩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年稽犁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骚亿。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡已亥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出来屠,到底是詐尸還是另有隱情陷猫,我是刑警寧澤秫舌,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站绣檬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嫂粟。R本人自食惡果不足惜娇未,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望星虹。 院中可真熱鬧零抬,春花似錦、人聲如沸宽涌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卸亮。三九已至忽妒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兼贸,已是汗流浹背段直。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溶诞,地道東北人鸯檬。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像螺垢,于是被迫代替她去往敵國和親喧务。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359