2017-06-05 52 views
0

我在這個查詢中遇到了一個奇怪的問題。 代碼:更改查詢參數時JPA非常奇怪的錯誤

em2=getNewEntityManager(); 
(...) 
Query query2 = em2.createNativeQuery("SELECT DISTINCT ID_ZONA FROM VWG_REL_USUARIOS_ZONAS WHERE DNI like '"+dni+"'") ; 
       List <Long> permisos = query2.getResultList(); 
(...) 

如果 「DNI」 等於 「%」 則查詢轉到正常的,但如果 「DNI」 是 「%123456789」 給出了這樣的錯誤

javax.persistence.PersistenceException:異常[EclipseLink-4002] (Eclipse持久性服務 - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException 內部異常:java.sql.SQLException:sql字符串不是dml語句 錯誤代碼:17129 調用:SELECT DISTINCT ID_ZONA F ROM VWG_REL_USUARIOS_ZONAS WHERE DNI LIKE '%XX828747B' 查詢:DataReadQuery(SQL = 「SELECT DISTINCT ID_ZONA FROM VWG_REL_USUARIOS_ZONAS WHERE DNI LIKE '%XX828747B'」)

如果我複製上面的確切查詢我的SQL開發人員,它像魔術一樣工作。 我試過用實體和所有東西的「createQuery」,同樣的錯誤。

非常感謝

+0

DNI是整數或字符串類型呢? –

+0

字符串類型,西班牙語DNI格式 –

回答

0

嘗試值,比如分配給一個參數,:

String dni = "some value"; 
Query query2 = em2.createNativeQuery("SELECT DISTINCT ID_ZONA FROM VWG_REL_USUARIOS_ZONAS WHERE DNI like :param") ; 
query2.setParamter("param", dni); 
List <Long> permisos = query2.getResultList(); 

更新:在的EclipseLink,只有索引參數支持,命名參數不支持。

+0

非常感謝,但我擔心在相同的情況下它會給我帶來同樣的錯誤。 :( –

+0

@LuayAbdulraheem原生查詢中的命名參數是不可移植的(並且在EclipseLink中不受支持) – crizzis

+0

@crizzis感謝您指出這一點,只有索引參數在EclipseLink中受支持,因此請嘗試使用它,而不要使用命名參數。 wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Native –

0

最後我明白了,它現在正在工作。

我在eclipse中調試模式下改變DNI值,以適應我想要做的測試。因此,會話驗證程序使我的用戶失效,因爲某些「魔術」數據以一種奇怪的方式發生了變化。爲了不進行每次編譯就進行測試,我必須在創建會話之前更改DNI值。

我不知道爲什麼當錯誤發生在驗證會話時,它會給出如此特定的SQL異常。喜歡的東西「會是無效的」將有救了我一兩個小時......

感謝您的時間