更改查询参数时JPA非常奇怪的错误

时间:2017-06-05 13:44:37

标签: java sql jpa persistence dml

我在这个查询中遇到了一个奇怪的问题。 代码:

String[] split = new Double(num).toString().split("\\.")
split[0].length() //num of decimal places

如果" dni"等于:"%"查询正常,但如果" dni"是"%123456789"给出了这个错误

  

javax.persistence.PersistenceException:Exception [EclipseLink-4002]   (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b):   org.eclipse.persistence.exceptions.DatabaseException           内部异常:java.sql.SQLException:sql string不是dml语句           错误代码:17129           调用:从VWG_REL_USUARIOS_ZONAS中选择​​DISTINCT ID_ZONA DNI喜欢'%XX828747B'           查询:DataReadQuery(sql =" SELECT DISTINCT ID_ZONA from VWG_REL_USUARIOS_ZONAS,DNI喜欢'%XX828747B'")

如果我在我的SQL开发人员中复制上面的确切查询,它就像魔术一样。 我已尝试使用" createQuery"与实体和所有的东西,相同的错误。

非常感谢

2 个答案:

答案 0 :(得分: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中,仅支持索引参数,不支持命名参数。

答案 1 :(得分:0)

最后我明白了,它现在正在运作。

我正在eclipse中调试模式下改变DNI值,以适应我想做的测试。因此,会话验证器使我的用户失去了一些数据&#34; by magic&#34;以一种奇怪的方式改变了。为了在不进行每次编译的情况下进行测试,我必须在创建会话之前更改DNI值。

我不知道的是,当错误源自验证会话时,它为什么会提供如此具体的SQL异常。像&#34;会话无效&#34;本来可以节省我几个小时......

感谢您的所有时间