Spring Data JPA 必須掌握的 20+ 個查詢關鍵字

微信公衆號:一個優秀的廢人
若有問題或建議,請後臺留言,我會盡力解決你的問題。

前言

又是小師弟的投稿,確是一個喜歡技術的朋友。如下爲原文:html

今天閒的無聊看 Spring Data JPA 官方文檔的時候,發現並無完整的 Jpa 關鍵字語義翻譯。因此今天寫了一篇中文文檔,若是有錯誤,望你們輕噴。前端

如下爲官方圖片以及示例代碼和註釋 :java

Spring Data JPA 關鍵字

Spring Data JPA 關鍵字

首先參照官方文檔建立指定數據庫算法

CREATE TABLE `demo_jpa`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `last_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sex` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `email` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `age` int(12) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

示例代碼及註釋<參照以上順序>spring

/**
 * @Author: EvilSay
 * @Date: 2019/2/25 16:15
 */
public interface DemoJpaRepositories extends JpaRepository<DemoJpa,Integer> {

    //根據firstName與LastName查找(二者必須在數據庫有)
    DemoJpa findByFirstNameAndLastName(String firstName, String lastName);

    //根據firstName或LastName查找(二者其一有就行)
    DemoJpa findByLastNameOrFirstName(String lastName,String firstName);

    //根據firstName查找它是否存在數據庫裏<相似與如下關鍵字>
    //DemoJpa findByFirstName(String firstName);
    DemoJpa findByFirstNameIs(String firstName);

    //在Age數值age到age2之間的數據
    List<DemoJpa> findByAgeBetween(Integer age, Integer age2);

    //小於指定age數值之間的數據
    List<DemoJpa> findByAgeLessThan(Integer age);

    //小於等於指定age數值的數據
    List<DemoJpa> findByAgeLessThanEqual(Integer age);

    //大於指定age數值之間的數據
    List<DemoJpa> findByAgeGreaterThan(Integer age);

    //大於或等於指定age數值之間的數據
    List<DemoJpa> findByAgeGreaterThanEqual(Integer age);

    //在指定age數值以前的數據相似關鍵字<LessThan>
    List<DemoJpa> findByAgeAfter(Integer age);

    //在指定age數值以後的數據相似關鍵字<GreaterThan>
    List<DemoJpa>  findByAgeBefore(Integer age);

    //返回age字段爲空的數據
    List<DemoJpa> findByAgeIsNull();

    //返回age字段不爲空的數據
    List<DemoJpa> findByAgeNotNull();

    /**
     * 該關鍵字我一度覺得是相似數據庫的模糊查詢,
     * 可是我去官方文檔看到它裏面並無通配符。
     * 因此我以爲它相似
     * DemoJpa findByFirstName(String firstName);
     * @see https://docs.spring.io/spring-data/jpa/docs/2.1.5.RELEASE/reference/html/#jpa.repositories
     */
    DemoJpa findByFirstNameLike(String firstName);

    //同上
    List<DemoJpa> findByFirstNameNotLike(String firstName);

    //查找數據庫中指定相似的名字(如:輸入一個名字"M" Jpa會返回多個包含M開頭的名字的數據源)<相似數據庫模糊查詢>
    List<DemoJpa> findByFirstNameStartingWith(String firstName);

    //查找數據庫中指定不相似的名字(同上)
    List<DemoJpa> findByFirstNameEndingWith(String firstName);

    //查找包含的指定數據源(這個與以上兩個字段不一樣的地方在與它必須輸入完整的數據才能夠查詢)
    List<DemoJpa> findByFirstNameContaining(String firstName);

    //根據age選取全部的數據源並按照LastName進行升序排序
    List<DemoJpa> findByAgeOrderByLastName(Integer age);

    //返回不是指定age的全部數據
    List<DemoJpa> findByAgeNot(Integer age);

    //查找包含多個指定age返回的數據
    List<DemoJpa> findByAgeIn(List<Integer> age);

}

單元測試<已經所有經過>sql

@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class DemoJpaRepositoriesTest {

    @Autowired
    private DemoJpaRepositories repositories;

    @Test
    public void findByFirstNameAndLastName() {
        DemoJpa demoJpa = repositories.findByFirstNameAndLastName("May", "Eden");
        Assert.assertEquals(demoJpa.getFirstName(),"May");
    }

    @Test
    public void findByLastNameOrFirstName() {
        DemoJpa demoJpa = repositories.findByLastNameOrFirstName("Geordie", "Eden");
        Assert.assertNotEquals(demoJpa.getLastName(),"Eden");
    }

    @Test
    public void findByFirstNameIs() {
        DemoJpa demoJpa = repositories.findByFirstNameIs("amy");
        Assert.assertNull(demoJpa);
    }

    @Test
    public void findByAgeBetween() {
        List<DemoJpa> demoJpaList = repositories.findByAgeBetween(15, 17);
        Assert.assertEquals(3,demoJpaList.size());
    }

    @Test
    public void findByAgeLessThan() {
        List<DemoJpa> demoJpaList = repositories.findByAgeLessThan(17);
        Assert.assertEquals(2,demoJpaList.size());
    }

    @Test
    public void findByAgeLessThanEqual() {
        List<DemoJpa> demoJpaList = repositories.findByAgeLessThanEqual(17);
        Assert.assertEquals(3,demoJpaList.size());
    }

    @Test
    public void findByAgeGreaterThan() {
        List<DemoJpa> demoJpaList = repositories.findByAgeGreaterThan(17);
        Assert.assertEquals(2,demoJpaList.size());
    }

    @Test
    public void findByAgeGreaterThanEqual() {
        List<DemoJpa> demoJpaList = repositories.findByAgeGreaterThanEqual(17);
        Assert.assertEquals(3,demoJpaList.size());
    }

    @Test
    public void findByAgeAfter() {
        List<DemoJpa> demoJpaList = repositories.findByAgeAfter(17);
        Assert.assertEquals(2,demoJpaList.size());
    }

    @Test
    public void findByAgeBefore() {
        List<DemoJpa> demoJpaList = repositories.findByAgeBefore(17);
        Assert.assertEquals(2,demoJpaList.size());
    }

    @Test
    public void findByAgeIsNull() {
        List<DemoJpa> demoJpaList = repositories.findByAgeIsNull();
        Assert.assertEquals(0,demoJpaList.size());
    }

    @Test
    public void findByAgeNotNull() {
        List<DemoJpa> demoJpaList = repositories.findByAgeNotNull();
        Assert.assertEquals(5,demoJpaList.size());
    }

    @Test
    public void findByFirstNameLike() {
        DemoJpa demoJpa = repositories.findByFirstNameLike("May");
        Assert.assertNotNull(demoJpa);
    }

    @Test
    public void findByFirstNameNotLike() {

    }

    @Test
    public void findByFirstNameStartingWith() {
        List<DemoJpa> demoJpaList = repositories.findByFirstNameStartingWith("May");
        Assert.assertEquals(2,demoJpaList.size());
    }

    @Test
    public void findByFirstNameEndingWith() {
        List<DemoJpa> demoJpaList = repositories.findByFirstNameEndingWith("Evil");
        Assert.assertEquals(0,demoJpaList.size());
    }

    @Test
    public void findByFirstNameContaining() {
        List<DemoJpa> demoJpaList = repositories.findByFirstNameContaining("hack");
        Assert.assertEquals(0,demoJpaList.size());
    }

    @Test
    public void findByAgeOrderByLastName() {
        List<DemoJpa> demoJpaList = repositories.findByAgeOrderByLastName(18);
        for (DemoJpa demoJpaL : demoJpaList){
            log.info("數據結果"+demoJpaL.toString());
        }
    }

    @Test
    public void findByAgeNot() {
        List<DemoJpa> demoJpaList = repositories.findByAgeNot(20);
        Assert.assertEquals(5,demoJpaList.size());
    }

    @Test
    public void findByAgeIn() {
        List<DemoJpa> demoJpaList = repositories.findByAgeIn(Arrays.asList(15, 16));
        Assert.assertEquals(2,demoJpaList.size());
    }

}

後語

若是本文對你哪怕有一丁點幫助,請幫忙點好看。你的好看是我堅持寫做的動力。數據庫

另外,關注以後在發送 1024 可領取免費學習資料。資料內容詳情請看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享微信

一個優秀的廢人

相關文章
相關標籤/搜索