Spring Data JPA 는 JPQL 을 사용 하여 네 이 티 브 SQL 과 조회 하 는 동작 입 니 다.

1.JPQL 문 구 를 사용 하여 조회
JPQL 언어(Java Persistence Query Language)는 SQL 과 매우 유사 한 중간 성과 대상 화 된 조회 언어 로 최종 적 으로 서로 다른 바 텀 데이터 베 이 스 를 위 한 SQL 언어 로 컴 파일 되 어 서로 다른 데이터 베 이 스 를 차단 합 니 다.
JPQL 언어 는 Query 인 터 페 이 스 를 통 해 실 행 됩 니 다.Query 인 터 페 이 스 는 데이터베이스 조 회 를 수행 하 는 방법 을 봉인 합 니 다.Entity Manager 의 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 이라는 두 주석 과 함께 설명 하고 맞 춤 형 업데이트 작업 을 정의 할 수 있 습 니 다.
Spring data jpa@query네 이 티 브 SQL 사용 시 주의해 야 할 구덩이
코드 에 따라 설명:

@Query(value = "select bill.id_ as id, bill.created_date as date, bill.no, lawyer_case .case_no as caseNo, " +
            "lawyer_case .case_name as caseName, customer.no as customerNo, customer.cn_name as customerName, " +
            "bill.total_expense_after_tax, bill.collected_money, bill.book_ticket_amount, bill.version " +
            "e1.name as creator, bill.status" +
            "from bill " +
            "left join lawyer_case on lawyer_case .case_no=bill.case_no " +
            "left join customer on customer.no=bill.customer_no " +
            "left join employee e1 on e1.id_=bill.creator " +
            "where IF (?1!='', customer_no=?1, 1=1) " +
            "and   IF (?2!='', case_no=?2, 1=1) " +
            "and   IF (?3!='', status=?3, 1=1) " +
            "and   IF (?4!='', creator'%',?4,'%')), 1=1) " +
            "and   create_by=?5 " +
            "ORDER BY ?#{#pageable} ",
            countQuery = "select count(*) " +
                    "from bill " +
                    "left join lawyer_case on lawyer_case .case_no=bill.case_no " +
                    "left join customer on customer.no=bill.customer_no " +
                    "left join employee e1 on e1.id_=bill.creator " +
                    "where IF (?1!='', customer_no=?1, 1=1) " +
                    "and   IF (?2!='', case_no=?2, 1=1) " +
                    "and   IF (?3!='', status=?3, 1=1) " +
                    "and   IF (?4!='', creator'%',?4,'%')), 1=1) " +
                    "and   create_by=?5 "+
                    "ORDER BY ?#{#pageable} ",
            nativeQuery = true)
    Page<Object[]> findAllBill(String customerNo, String caseNo, Integer status, String creator,
                               String createBy, Pageable pageable);
주의해 야 할 방법 은 다음 과 같은 몇 가지 가 있다.
1.From 는 이름 바 꾸 기 를 지원 하지 않 습 니 다.
2.하나의 page를 되 돌려 줍 니 다.배열 에 데이터 만 저장 되 어 있 고 대응 하 는 key 가 없 으 며 데 이 터 를 되 돌려 주 는 순서에 따라 DTO 에 순서대로 주입 할 수 있 습 니 다.
3.페이지 사용 에 대해 서 는"ORDER BY?\#{\#"가 필요 합 니 다."pageable}"은 pageable 대상 에 직접 들 어 갈 수 있 고 자동 으로 해 석 됩 니 다.
4.격식 문제 에 주의 하 세 요.줄 을 바 꿀 때 빈 칸 이 없 는 경우 가 많 습 니 다.
5.데이터베이스 에 있 는 표 필드 에 자세히 대응 하면 특정한 필드 를 찾 을 수 없 는 경우 가 많 습 니 다.바로 필드 이름 이 잘못 쓰 여 데이터베이스 에 대응 하지 못 하기 때 문 입 니 다.
6.이것 은 마이크로 서 비 스 를 사용 하 는 것 을 해결 하 는 것 입 니 다.대량의 데 이 터 는 원 격 호출 이 필요 하고 프로그램의 성능 을 떨 어 뜨 릴 수 있 습 니 다.
7.Pageabel 을 매개 변수 로 사용 할 때 페이지 를 나눈다.처음에는 실행 가능 한 방법 이 라 고 생각 했 지만 주의해 야 할 때 정렬 이 필요 할 때 sort 필드 를 추가 할 수 없습니다.계속 잘못 보고 할 거 야.
8.7 의 해결 방안 에 대해 원생 SQL 의 데이터 조회 와 countQuery 를 두 가지 조회 방법 으로 나눈다.count 를 받 은 후 판단 을 하고 0 과 같 으 면 빈 집합 으로 돌아 갑 니 다.반대로 데 이 터 를 가 져 옵 니 다.페이지 를 나 누 어 계산 하고 정확 한 pageNumber 와 pageSize 를 입력 해 야 합 니 다.대부분의 시스템 은 수정 시간 에 따라 내림차 순 으로 정렬 된다.그래서 order by 는 죽음 을 쓸 수 있 습 니 다.그리고 페이지 번호 와 페이지 사이즈 가 동적 으로 들 어 옵 니 다.pageNumber 의 알고리즘=(pageNumber-1)*pageSize,전 제 는 PageNumber 가 1 부터 시작 하고 0 이면 pageNumber=pageNumber*PageSize;이렇게 하면 데이터 의 정확성 을 보증 할 수 있다.

/**
* pageInfos:        。
* pageable:   pageable.
* totalPage:    SQL      。
*             pageDTO。
*/
private Page<T> convertForPage(List<T> pageInfos, Pageable pageable, Integer totalPage) {
        return new PageImpl<>(pageInfos, pageable, totalPage);
    }
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기