Spring Data JPA使用JPQL與原生SQL進行查詢

1、使用JPQL語句進行查詢

JPQL語言(Java Persistence Query Language)是一種和SQL非常類似的中間性和對象化查詢語言,它最終會被編譯成針對不同底層數據庫的SQL語言,從而屏蔽不同數據庫的差異。

JPQL語言通過Query接口封裝執行,Query 接口封裝了執行數據庫查詢的相關方法。調用 EntityManager 的 Query、NamedQuery 及 NativeQuery 方法可以獲得查詢對象,進而可調用Query接口的相關方法來執行查詢操作。

JPQL是面向對象進行查詢的語言,可以通過自定義的JPQL完成UPDATE和DELETE操作。JPQL不支持使用INSERT。對於UPDATE或DELETE操作,必須使用註解 @Modifying 進行修飾。

【示例】使用JPQL語言進行查詢。

package com.pjb.jpauserdemo.dao;

import com.pjb.jpauserdemo.entity.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 用戶信息數據庫訪問接口
 * 使用JPQL語言
 * @author pan_junbiao
 **/
@Repository
public interface UserJpqlDao extends JpaRepository<UserInfo,Integer>
{
    /**
     * 根據用戶姓名,查詢用戶信息
     */
    @Query("SELECT u FROM UserInfo u WHERE u.userName = ?1")
    public UserInfo getUserInfoByName(String name);

    /**
     * 根據用戶姓名,模糊查詢用戶列表
     */
    @Query("SELECT u FROM UserInfo u WHERE u.userName like %:name%")
    public List<UserInfo> getUserListByName(String name);

    /**
     * 修改用戶姓名
     */
    @Modifying
    @Query("UPDATE UserInfo u SET u.userName = :name WHERE u.userId = :id")
    public int updateUserName(@Param("id")int userId, @Param("name")String userName);
}

 

2、使用原生SQL語句進行查詢

在使用原生SQL查詢時,也使用@Query註解。此時,nativeQuery參數需要設置爲true。

【示例】使用原生SQL語句進行查詢。

package com.pjb.jpauserdemo.dao;

import com.pjb.jpauserdemo.entity.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 用戶信息數據庫訪問接口測試類
 * 使用原生SQL語言
 * @author pan_junbiao
 **/
@Repository
public interface UserSqlDao extends JpaRepository<UserInfo,Integer>
{
    /**
     * 根據用戶ID,獲取用戶信息
     */
    @Query(value = "SELECT * FROM tb_user WHERE user_id = :id",nativeQuery = true)
    public UserInfo getUserById(@Param("id")int userId);

    /**
     * 根據用戶姓名,模糊查詢用戶列表
     */
    @Query(value = "SELECT * FROM tb_user WHERE user_name LIKE %:userName%",nativeQuery = true)
    public List<UserInfo> getUserListByName(@Param("userName")String userName);

    /**
     * 修改用戶姓名
     */
    @Modifying
    @Query(value = "UPDATE tb_user SET user_name = :name WHERE user_id = :id",nativeQuery = true)
    public int updateUserName(@Param("id")int userId, @Param("name")String userName);
}

可以看到,@Query與@Modifying這兩個註解一起聲明,可以定義個性化更新操作。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章