2

我正在使用Hiberante连接到postgres数据库。我正在尝试将记录插入数据库。我有一个字符串数组中的记录值,该数组是从 csv 文件中获取的。这是我的道代码

StringBuffer query=new StringBuffer("insert into t_wonlist values(");
        for(int i=0;i<67;i++){
            query.append(values[i]+",");
        }
        query.deleteCharAt(query.lastIndexOf(","));
        query.append(");");

        sessionfactory.getCurrentSession().createSQLQuery(query.toString()).executeUpdate();
        System.out.println("Query executed");
        sessionfactory.getCurrentSession().flush();

我正在使用 StringBuffer,以便可以使用 for 循环将值附加到查询中。

但是当我执行查询时,出现以下异常

 org.postgresql.util.PSQLException: No value specified for parameter 1.

我确信参数的数量是正确的。有人能帮我吗。谢谢

4

1 回答 1

4

你正在以一种奇怪而倒退的方式处理这个问题。

直接的问题可能是无法?在其中一个输入字符串中转义/引用 a,因此 PgJDBC 认为它是一个查询参数。这并不意味着您应该通过转义/引用问号来解决它,这表明您采取了完全错误的方法。

请阅读有关 SQL 注入的页面此站点

您正在使用 Hibernate ORM,因此您通常会使用 JPA 接口或直接 Hibernate 接口来创建新的域对象并将它们持久化。典型的方法是对new一个对象,然后使用EntityManager.persist方法(如果使用 JPA)或Session.save方法(如果直接使用 Hibernate)来持久化实体。

如果你想使用直接 JDBC,你应该创建一个 JDBC PreparedStatement,设置它的参数,然后应用它。请参阅本教程。由于您正在加载 CSV,因此您通常会在 JDBC 批处理中执行此操作,尽管这在 PostgreSQL 中实际上并没有给您带来太多好处。

COPY更好的是,由于您正在导入 CSV,您可能只需通过 PgJDBC 的CopyManager使用 PostgreSQL 的内置命令将更改有效地流式传输到目标表中。

于 2013-05-04T12:08:05.493 回答