2017-06-05 51 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异常。喜欢的东西“会是无效的”将有救了我一两个小时......

感谢您的时间