springdataJPA 가 원생 sql 에 지원 하 는 문 제 를 해결 합 니 다.
5626 단어 springdataJPAsql지지 하 다.
프로젝트 에 사용 되 는 것 은 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 를 추가 하면 됩 니 다.이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
복합 인덱스에 대한 YugabyteDB 스킵 스캔 일명 느슨한 인덱스 스캔인덱스 스캔이 두 번째 열의 범위에 액세스하기 위해 첫 번째 인덱스 열을 건너뛸 수 있는 방법을 테스트했습니다. 아이디어는 하나( i2 )에 모든 열이 인덱스 키로 있고 다른 하나( i1 )에 키의 일부가 아닌 마지...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.