springdataJPA 가 원생 sql 에 지원 하 는 문 제 를 해결 합 니 다.

질문
프로젝트 에 사용 되 는 것 은 springdataJPA 연결 데이터 베 이 스 를 조작 하 는 것 입 니 다.그러나 JPA 의 hql 문 구 는 업무 요 구 를 만족 시 키 지 못 하기 때문에 원생 sql 을 사용 해 야 합 니 다.
하지만 한 가지 질문 이 있 습 니 다.

  @Query(value = "SELECT ppd.* FROM  zt_productionplandetails AS ppd 
" + " \tLEFT JOIN zt_salesplan sp ON sp.id=ppd.salesPlan_id
" + " \tLEFT JOIN zt_employee e ON e.id=ppd.employeeId
" + " \tWHERE ppd.enabled = TRUE
" + " \tAND ppd.`status`=1
" + "\tAND IF(:clientName !='', sp.clientName LIKE %:clientName%, 1 = 1 )
" + " \tAND IF( :productName !='', sp.productName LIKE %:productName%, 1 = 1 )
" + " \tAND IF( :empName != '', e.name LIKE %:empName%, 1 = 1 )
" + " \tAND IF( :startDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) >=:startDate, 1 = 1 )
" + " \tAND IF( :endDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) <=:endDate, 1 = 1 )" ,nativeQuery = true) Page<ProductionPlanDetails> findNewPlan(@Param("productName") String productName, @Param("empName") String empName, @Param("endDate") String endDate, @Param("startDate") String startDate, @Param("clientName") String clientName, Pageable pageable);
이 sql 을 사용 할 때 오류 가 발생 합 니 다.
java.sql.SQLSyntaxErrorException: Unknown column 'ppd' in 'field list'
ppd 필드 를 찾 을 수 없다 는 뜻 이지 만 ppd 가 별명 임 이 분명 합 니 다.
프로젝트 시작 조회 데이터 호출 sql 은 다음 과 같 습 니 다.

select count(ppd) FROM  zt_productionplandetails AS ppd 
        LEFT JOIN zt_salesplan  sp ON sp.id=ppd.salesPlan_id 
          LEFT JOIN zt_employee  e ON e.id=ppd.employeeId
           WHERE ppd.enabled = TRUE 
           AND ppd.`status`=1 
 AND IF(? !='', sp.clientName LIKE ?, 1 = 1 )
            AND IF( ? !='', sp.productName LIKE ?, 1 = 1 )
             AND IF( ? != '', e.name LIKE ?, 1 = 1 )
             AND IF( ? != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) >=?, 1 = 1 )
             AND IF( ? != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) <=?, 1 = 1 )
여기 서 문제점 을 발 견 했 습 니 다.프로젝트 가 sql 을 실행 할 때 count(ppd)를 조회 합 니 다.문 서 를 조회 할 때 기본 적 인 상황 에서 jpa 는 sql 을 조회 할 때 count()를 추가 합 니 다.
그래서 다음 과 같은 수정 을 한다.

@Query(value = "SELECT ppd.* FROM  zt_productionplandetails AS ppd 
" + " \tLEFT JOIN zt_salesplan sp ON sp.id=ppd.salesPlan_id
" + " \tLEFT JOIN zt_employee e ON e.id=ppd.employeeId
" + " \tWHERE ppd.enabled = TRUE
" + " \tAND ppd.`status`=1
" + "\tAND IF(:clientName !='', sp.clientName LIKE %:clientName%, 1 = 1 )
" + " \tAND IF( :productName !='', sp.productName LIKE %:productName%, 1 = 1 )
" + " \tAND IF( :empName != '', e.name LIKE %:empName%, 1 = 1 )
" + " \tAND IF( :startDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) >=:startDate, 1 = 1 )
" + " \tAND IF( :endDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) <=:endDate, 1 = 1 )", countQuery = "SELECT count(*) FROM zt_productionplandetails AS ppd
" + " \tLEFT JOIN zt_salesplan sp ON sp.id=ppd.salesPlan_id
" + " \tLEFT JOIN zt_employee e ON e.id=ppd.employeeId
" + " \tWHERE ppd.enabled = TRUE
" + " \tAND ppd.`status`=1
" + "\tAND IF(:clientName !='', sp.clientName LIKE %:clientName%, 1 = 1 )
" + " \tAND IF( :productName !='', sp.productName LIKE %:productName%, 1 = 1 )
" + " \tAND IF( :empName != '', e.name LIKE %:empName%, 1 = 1 )
" + " \tAND IF( :startDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) >=:startDate, 1 = 1 )
" + " \tAND IF( :endDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) <=:endDate, 1 = 1 )" ,nativeQuery = true)
countQuery 인자 추가
문제 해결~
Spring Data JPA 는 원생 sql 문 구 를 씁 니 다.
Spring Data JPA 를 사용 할 때,일반적으로 우 리 는 Jpa Repository 를 계승 하기 만 하면 대부분의 자주 사용 하 는 첨삭 검사 방법 을 얻 을 수 있다.때때로 우 리 는 사용자 정의 HQL 문 구 를 쓸 수 있 는 검색 방법 을 사용자 정의 해 야 한다.
하지만 Spring Data JPA 를 사용 할 때 는 보통 Jpa Repository 를 계승 하면 대부분의 추가 삭제 와 검 사 를 받 을 수 있 습 니 다.때때로 우 리 는 사용자 정의 HQL 문 구 를 쓸 수 있 는 검색 방법 을 사용자 정의 해 야 한다.

@Query(value = "   sql  ", nativeQuery = true)
List<Long> findFriendsByUserId(Long userId);
위 와 같이 검색 어 뒤에 nativeQuery=true 를 추가 하면 됩 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기