반응형
java persistence native sql 매개 변수를 허용하지 않음
제 질문은
sql = "SELECT SUM(TOTAL_BYTES_DELIVERED) / SUM(TOTAL_TIME_TAKEN_IN_DELIVERY)
FROM MV_MFT_TRANSFER
WHERE TRANSFER_INITIATION_TIME > :startDate
AND TRANSFER_INITIATION_TIME < :endDate"
Query query = em.createNativeQuery(sql);
query.setParameter("startDate", startDate, TemporalType.DATE);
query.setParameter("endDate", endDate, TemporalType.DATE);
query.getResultList();'
이 프로그램을 실행하면 오류가 발생합니다.
SQLExceptionTHrown:
<Sep 11, 2012 12:50:46 PM PDT> <Warning> <EclipseLink> <BEA-2005000> <2012-09-11 12:50:46.893--UnitOfWork(1387841584)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20120804-d768c4f): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Missing IN or OUT parameter at index:: 1
Error Code: 17041
Call: SELECT SUM(TOTAL_BYTES_DELIVERED) / SUM(TOTAL_TIME_TAKEN_IN_DELIVERY) FROM MV_MFT_TRANSFER WHERE TRANSFER_INITIATION_TIME > :startDate AND TRANSFER_INITIATION_TIME < :endDate
Query: DataReadQuery(sql="SELECT SUM(TOTAL_BYTES_DELIVERED) / SUM(TOTAL_TIME_TAKEN_IN_DELIVERY) FROM MV_MFT_TRANSFER WHERE TRANSFER_INITIATION_TIME > :startDate AND TRANSFER_INITIATION_TIME < :endDate")>
***SQLException in init() TRANSFER METRICS BEAN****
Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20120804-d768c4f): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Missing IN or OUT parameter at index:: 1
다음 솔루션이 작동해야 합니다.
sql = "SELECT SUM(TOTAL_BYTES_DELIVERED) / SUM(TOTAL_TIME_TAKEN_IN_DELIVERY)
FROM MV_MFT_TRANSFER
WHERE TRANSFER_INITIATION_TIME > ?
AND TRANSFER_INITIATION_TIME < ?"
Query query = em.createNativeQuery(sql);
query.setParameter(1, startDate, TemporalType.DATE);
query.setParameter(2, endDate, TemporalType.DATE);
query.getResultList();
위치 매개 변수를 사용하면 작동할 것으로 보입니다.명명된 매개 변수와 네이티브 쿼리를 결합할 수 없습니다.다음은 몇 가지 링크입니다.
http://java.boot.by/scbcd5-guide/ch08s05.html
http://www.wisegeek.com/what-are-native-queries.htm
그리고 더 많은 것들이 구글에서 "위치 매개변수 바인딩만 네이티브 쿼리에 휴대용으로 사용될 수 있습니다."라고 검색합니다.
편집: 유사한 문제가 있는 질문에 대한 추가 링크:
JPA/Hibernate 네이티브 쿼리가 매개 변수를 인식하지 못함
이 기사는 정말 도움이 되었습니다!
http://software-security.sans.org/developer-how-to/fix-sql-injection-in-java-persistence-api-jpa
기사의 요지는 다음과 같습니다.
안전하지 않은 쿼리입니다. 사용하지 마십시오!문자열 연결이 잘못되었습니다.
List results = entityManager.createQuery("Select order from Orders order where order.id = " + orderId).getResultList();
List results = entityManager.createNativeQuery("Select * from Books where author = " + author).getResultList();
int resultCode = entityManager.createNativeQuery("Delete from Cart where itemId = " + itemId).executeUpdate();
안전한 쿼리입니다.
/* positional parameter in JPQL */
Query jpqlQuery = entityManager.createQuery("Select order from Orders order where order.id = ?1");
List results = jpqlQuery.setParameter(1, "123-ADB-567-QTWYTFDL").getResultList();
/* named parameter in JPQL */
Query jpqlQuery = entityManager.createQuery("Select emp from Employees emp where emp.incentive > :incentive");
List results = jpqlQuery.setParameter("incentive", new Long(10000)).getResultList();
/* named query in JPQL - Query named "myCart" being "Select c from Cart c where c.itemId = :itemId" */
Query jpqlQuery = entityManager.createNamedQuery("myCart");
List results = jpqlQuery.setParameter("itemId", "item-id-0001").getResultList();
/* Native SQL */
Query sqlQuery = entityManager.createNativeQuery("Select * from Books where author = ?", Book.class);
List results = sqlQuery.setParameter(1, "Charles Dickens").getResultList();
JPA에서
다음을 사용하는 경우:
쿼리 쿼리 = em.createNativeQuery(sql);
설정 매개 변수에 대한 인덱스를 설정해야 합니다.쿼리에 두 개 이상의 매개 변수가 있습니다.
언급URL : https://stackoverflow.com/questions/12377165/java-persistence-native-sql-not-accepting-parameters
반응형
'programing' 카테고리의 다른 글
동일한 시스템에 여러 Python 버전이 있습니까? (0) | 2023.07.21 |
---|---|
exp 명령은 원격 DB 테이블을 내보낼 호스트 및 포트를 허용합니다. (0) | 2023.07.21 |
파이썬에서 문자열을 분할하고 구문 분석하려면 어떻게 해야 합니까? (0) | 2023.07.21 |
문자열을 토큰으로 분할하여 배열에 저장 (0) | 2023.07.16 |
Python의 포인터? (0) | 2023.07.16 |