【问题标题】:JPA very strange error when change query parameter更改查询参数时JPA非常奇怪的错误
【发布时间】:2017-11-06 07:30:27
【问题描述】:

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

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 FROM 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”,同样的错误。

非常感谢

【问题讨论】:

  • dni是整数还是字符串类型?
  • 字符串类型,西班牙DNI格式

标签: java sql jpa persistence dml


【解决方案1】:

终于搞定了,现在可以用了。

我在 Eclipse 的调试模式下更改了 DNI 值,以适应我想做的测试。因此,会话验证器使我的用户无效,因为某些数据“通过魔术”以一种奇怪的方式发生了变化。要在每次不编译的情况下进行测试,我必须在创建会话之前更改 DNI 值。

我不知道为什么当错误源自验证会话时它会给出如此具体的 SQL 异常。诸如“会话无效”之类的内容可以为我节省几个小时...

感谢大家的宝贵时间

【讨论】:

    【解决方案2】:

    尝试将值分配给参数,例如:

    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 中,仅支持索引参数,不支持命名参数。

    【讨论】:

    • 非常感谢,但我担心在同样的情况下它会给我同样的错误。 :(
    • @LuayAbdulraheem 本机查询中的命名参数不可移植(EclipseLink 不支持)
    • @crizzis 感谢您指出这一点。 EclipseLink 仅支持索引参数,因此请尝试使用索引参数而不是命名参数。寻求帮助:wiki.eclipse.org/EclipseLink/UserGuide/JPA/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多