2012-09-11 26 views
14

を受け入れていない、私のクエリは、私がこれを実行するとJavaの永続ネイティブ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 
+1

欠落入力パラメータに関連するグループはどのようになっていますか –

+4

@alfasin - 'aggregate'関数があるからといって、必ずしも' GROUP BY'を必要とするわけではありません。集約関数は "しばしば"(常にではない)追加された 'GROUP BY'ステートメントを必要とします。 – 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

そしてより多くの、ちょうどのためにグーグル:「移植性ネイティブクエリのために使用することができる唯一の位置パラメータバインディング」。

EDIT:同様の問題に関する質問へのより多くのリンク:

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

これらは安全クエリです。

あなたはこの使用JPA

/* 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


クエリクエリを= EMが。 createNativeQuery(sql);

設定パラメータにはインデックスを設定する必要があります。クエリには複数のパラメータがあります。

関連する問題