2012-09-11 15 views
14

स्वीकार नहीं कर मेरी क्वेरीजावा हठ देशी एसक्यूएल मापदंडों

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 
+1

गुम इनपुट पैरामीटर –

+4

@alfasin से संबंधित समूह कैसे है - सिर्फ इसलिए कि 'कुल' फ़ंक्शन है, इसका मतलब यह नहीं है कि इसे 'ग्रुप बाय' की आवश्यकता है। कुल कार्यों "अक्सर" (हमेशा नहीं) को एक अतिरिक्त 'ग्रुप बाय' कथन की आवश्यकता होती है। – Annjawn

+0

मैं दृढ़ता से अपेक्षाकृत नया हूं। क्या मैं कुछ वाक्यविन्यास त्रुटि कर रहा हूं? मेरे पास कोड का एक समान हिस्सा है जो क्वेरी करता है जब क्वेरी em.createQuery() API का उपयोग करके बनाई जाती है। –

उत्तर

18

निम्नलिखित समाधान काम करना चाहिए है:

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

और कई और अधिक, बस के लिए गूगल: "केवल स्थितीय पैरामीटर बाध्यकारी portably देशी प्रश्नों के लिए इस्तेमाल किया जा सकता है"।

संपादित करें: अधिक इसी तरह के मुद्दों के साथ सवालों के लिंक:

How to get all the element from JDBC query

JPA/Hibernate Native Queries do not recognize Parameters

2

यह लेख वास्तव में मददगार था!

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(); 
0

जेपीए
में

जब आप इस का उपयोग करें:

क्वेरी क्वेरी = उन्हें। createNativeQuery (एसक्यूएल);

आपको सेट पैरामीटर के लिए इंडेक्स सेट करना होगा। ध्यान दें कि आपकी क्वेरी में एक से अधिक पैरामीटर हैं।

संबंधित मुद्दे