EclipseLink 错误?简单的原生 SQL 查询异常

Posted

技术标签:

【中文标题】EclipseLink 错误?简单的原生 SQL 查询异常【英文标题】:EclipseLink-Bug? Simple native SQL query exception 【发布时间】:2015-09-17 09:54:16 【问题描述】:

我无法使用 EclipseLink 执行以下查询:

String query = "insert into A_TEST (TEST_NAME) values ('Ain''t it cool? It''s cool, or?')";


    EntityManagerFactory emf = Persistence.createEntityManagerFactory("jdbc-unit");
    EntityManager em = null;

    try 
        em = emf.createEntityManager();
        em.getTransaction().begin();

        Query q = em.createNativeQuery(query);
        //q.setHint(QueryHints.BIND_PARAMETERS, HintValues.FALSE);
        q.executeUpdate();

        em.getTransaction().commit();

     catch (Exception ex) 
        ex.printStackTrace();
     finally 
        try 
            if (em != null) 
                if (em.getTransaction().isActive()) 
                    em.getTransaction().rollback();
                em.close();
            
         catch (Exception ex) 
            ex.printStackTrace();
        
    

堆栈跟踪:

javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Ungültiger Spaltenindex
Error Code: 17003
Call: insert into A_TEST (TEST_NAME) values ('Ain''t it cool? It''s cool, or?)
bind => [1 parameter bound]
Query: DataModifyQuery(sql="insert into A_TEST (TEST_NAME) values ('Ain''t it cool? It''s cool, or?)")
at org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:308)
at persistence.test.ErrorTest.main(ErrorTest.java:43)

我发现问题在于问号和引号。如果我删除它是有效的。这些字符的顺序似乎也很重要。

有人知道这个问题吗?

PS:行“q.setHint(QueryHints.BIND_PARAMETERS, HintValues.FALSE);”另一个例外。


我已经解决了:q.setHint(QueryHints.BIND_PARAMETERS, HintValues.TRUE);为我工作

【问题讨论】:

【参考方案1】:

我会传递查询参数来为我进行适当的转义。检查EclipseLink help pages。如果此类查询的一部分是用户输入,则将整个 SQL 作为字符串传递也可能导致安全问题(SQL 注入)。

query = "insert into A_TEST (TEST_NAME) values (?)";
...
query.setParameter(1, "Ain't it cool? It's cool, or?");

【讨论】:

参数是正确的方法。深入一点,“幼稚”的字符引用没有帮助,对于某些服务器\驱动程序环境应该引用 ''' 和其他为 \' ... 。不幸的是,原始 JDBC 不支持我最喜欢的命名参数 我知道使用带参数的预处理语句会更好,但我习惯用这种方式编写SQL。此外,我有一个帮助类来封装上面的代码,并且只使用一个字符串(SQL)作为方法参数。尽管如此,我还是通过设置 BIND_PARAMETERS=TRUE 解决了我的问题 :) 还是谢谢 在这种情况下,请务必检查任何用户输入的危险字符串,例如“...; drop database ...” :)

以上是关于EclipseLink 错误?简单的原生 SQL 查询异常的主要内容,如果未能解决你的问题,请参考以下文章

控制台查看原生sql

JavaEE + eclipseLink + TomEE 给出 java.sql.SQLSyntaxErrorException: 用户缺少权限或找不到对象

EclipseLink/JPA 是不是有用于修改生成的 SQL 的插件框架?

是否可以使用 EclipseLink 输出生成的 SQL 而无需增加日志的详细程度?

JPA 2.1、Eclipselink、SQL Server、Spring - NamedStoredProcedureQuery 结果映射

使用 EclipseLink 和 UCanAccess 的持久性错误