1. 程式人生 > >快速學習Spring Data JPA -- 第三章JPA自定義查詢@Query

快速學習Spring Data JPA -- 第三章JPA自定義查詢@Query

xl_echo編輯整理,交流學習請加1280023003 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!


其實通過前面兩章,我們不難看出,如果是僅僅按照JPA提供的關鍵詞和定義規則,我們在操作資料庫的時候,會有一定的侷限性。當涉及到比較複雜的資料操作的時候,我們命名方法有可能就很難下手。所以,JPA也對此提供瞭解決辦法,@Query

@Query是一個註解,作用在於宣告在一個Repository的查詢方法上,同時配置JPQL語法,編寫sql語句就可以達到我們想要的效果。類似於hibernate的hql語句。

JPQL語句
這種語句有一個很明顯的特徵,那就是很類似SQL,但是與SQL不同的是,它的欄位在編寫時不是資料庫欄位,而是實體類中的屬性。比如:表名用Entity名稱來代替,欄位用Entity.properties來代替。

JPQL例項演示

package com.echo.example.example.repository;

import com.echo.example.example.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

/**
 * author:XLecho
 * Date:2018/10/26 0026
 * Time:9:54
 */
public interface UserRepositoryExtendsJpaRepository
extends JpaRepository<User, Long> { @Query("select u from User u where u.email = ?1") User findByEmail(String email); }

相對來說如果使用JPQL語句比較容易和SQL混淆,那麼我們的@Query支不支援sql語句呢?

@Query支援原生SQL

當你不會用JPQL的時候,基本的查詢方法不能滿足需求的時候,建議直接使用原生SQL語句。樓主也是喜歡使用原生SQL,不容易混淆出錯。

要原生sql生效,需要在@Query中加上nativeQuery=true

示例:

package com.echo.example.example.repository;

import com.echo.example.example.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.Optional;

/**
 * author:XLecho
 * Date:2018/10/26 0026
 * Time:9:54
 */
public interface UserRepositoryExtendsJpaRepository extends JpaRepository<User, Long> {

    @Query(value = "select * from user where id = ?1", nativeQuery=true)
    Optional<User> queryByIdTest(Long id);

}

@Query分頁

這裡直接使用Pageable的實現類來完成分頁

package com.echo.example.example.repository;

import com.echo.example.example.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.awt.print.Pageable;
import java.util.List;
import java.util.Optional;

/**
 * author:XLecho
 * Date:2018/10/26 0026
 * Time:9:54
 */
public interface UserRepositoryExtendsJpaRepository extends JpaRepository<User, Long> {

    @Query(value = "select * from user where email = ?1", nativeQuery = true)
    Page<User> queryLikeEmail(String email, PageRequest pageable);

}

專案地址:https://git.coding.net/xlecho/SpringDataJpa.git