快速學習Spring Data JPA -- 第三章JPA自定義查詢@Query
阿新 • • 發佈:2018-11-01
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);
}