没有为参数1指定值

时间:2013-05-04 12:01:28

标签: java database hibernate postgresql

我正在使用 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.

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

1 个答案:

答案 0 :(得分:4)

你以一种奇怪而倒退的方式接近这一点。

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

请阅读this page on SQL injectionthis site

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

如果要使用直接JDBC,则应创建JDBC PreparedStatement,设置其参数,然后应用它。见this tutorial。由于您正在加载CSV,因此通常在JDBC批处理中执行此操作,但这实际上并没有在PostgreSQL中获得太多。

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