Java 更改查询参数时出现非常奇怪的错误

Java 更改查询参数时出现非常奇怪的错误,java,sql,jpa,persistence,dml,Java,Sql,Jpa,Persistence,Dml,我在这个查询中遇到了一个奇怪的问题。 代码: em2=getNewEntityManager(); (...) Query query2=em2.createNativeQuery(“从VWG_REL_USUARIOS_ZONAS中选择不同的ID_ZONA,其中DNI类似于“'+DNI+””); List permisos=query2.getResultList(); (...) 如果“dni”等于:“%,则查询正常,但如果“dni”为“%123456789”,则会出现此错误 javax.p

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

em2=getNewEntityManager();
(...)
Query query2=em2.createNativeQuery(“从VWG_REL_USUARIOS_ZONAS中选择不同的ID_ZONA,其中DNI类似于“'+DNI+””);
List 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 调用:从VWG_REL_USUARIOS_ZONA中选择不同的ID_ZONA,其中DNI类似“%XX828747B” 查询:DataReadQuery(sql=“从VWG中选择不同的ID区域”\u REL\u USUARIOS\u区域,其中DNI类似于“%XX828747B”)

如果我在我的SQL开发人员中复制上面的精确查询,它将发挥神奇的作用。 我试过用“createQuery”处理实体和所有的东西,同样的错误


非常感谢

尝试将值指定给参数,例如:

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();
String dni=“某些值”;
Query query2=em2.createNativeQuery(“从VWG_REL_USUARIOS_ZONAS中选择不同的ID_ZONA,其中DNI like:param”);
查询2.设置参数(“参数”,dni);
List permisos=query2.getResultList();

更新:在EclipseLink中,只支持索引参数,不支持命名参数。

最后我得到了它,它现在正在工作

我在eclipse的调试模式下更改了DNI值,以适合我想要做的测试。因此,会话验证器在一些数据以一种奇怪的方式“神奇地”更改时,使我的密码对用户无效。要在每次不编译的情况下进行测试,我必须在创建会话之前更改DNI值

我不知道的是,当验证会话时出现错误时,为什么它会给出如此具体的SQL异常。像“会话无效”这样的东西会帮我节省几个小时


非常感谢您的时间

dni是整数还是字符串类型?字符串类型,西班牙语dni格式非常感谢,但我很惊讶,在相同的情况下,它会给我相同的错误:(@LuayabDullaheem本机查询中的命名参数不可移植(在EclipseLink中不受支持)@crizzis感谢您指出这一点。EclipseLink中只支持索引参数,因此请尝试使用该参数而不是命名参数。有关帮助:
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();